题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
一趟扫描:双指针,初始化为 l = head, r = head ->…-> next(n次),然后同时右移双指针,直到 r 到达链表最后一个元素,此时的 l 所指向的元素就是要删除的元素。
但是这样不易实现,一点是当 l 指向要删除元素时,还需记录其上一个结点。另一点是如果要删除的是倒数最后一个元素,也即第一个元素,则双指针右移时会导致 r 指向 NULL。所以需进行优化。
初始化时,建立哑结点,使其指向 head,再按照同样思路即可实现
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* l = new ListNode(0);
ListNode* res = l;
ListNode* r = l;
l->next = head;
while(n--) {
r = r->next;
}
printf("r->val = %d\n", r->val);
while(1) {
if(r->next == NULL) {
l->next = l->next->next;
break;
}
r = r->next;
l = l->next;
printf("l = %d, r = %d\n", l->val, r->val);
}
res = res->next;
return res;
}
};