一、源码
//定义ListNode结构、三种构造函数
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
//释放new开辟的空间,不进行会导致内存泄漏
void releaseNode(ListNode* node)
{
//创建临时节点
ListNode* temp = NULL;
if (node == NULL)
{
cout << "链表节点内存为空\n";
}
else
{
while (node != NULL)
{
temp = node;
node = node->next;
delete temp;
cout << "节点内存清除成功\n";
}
}
}
//用于删除链表中的倒数第n个节点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* p = head;
int len = 0;
while (p != nullptr) {
len++;
p = p->next;
}
if (n == len) {
head = head->next;
}
int i = 0;
p = head;
while (i < len - n - 1) {
p = p->next;
i++;
}
p->val = p->next->val;
p->next = p->next->next;
return head;
}
};
int main() {
Solution solution;
//构造链表
vector<int> value = { 1,2,3,4,5 };
int len = value.size();
ListNode* head = new ListNode(value[len-1]);
for (int i = 1; i < len; i++) {
head = new ListNode(value[len-1-i], head);
}
//删除元素前的链表
ListNode* temp = head;
while (temp != nullptr) {
cout << temp->val << endl;
temp = temp->next;
}
//removeNthFromEnd是定义的函数:用于删除链表中的倒数第n个节点
solution.removeNthFromEnd(head, 2);
//删除元素后的链表
temp = head;
while (temp != nullptr) {
cout << temp->val << endl;
temp = temp->next;
}
//释放堆内存
releaseNode(head);
return 0;
}
二、运行结果:
在这里插入图片描述