这个题的思路其实非常简单,就用快慢指针,在一次遍历中,使快指针与慢指针之间的距离为n。但是实现过程确实充满波折,怀疑人生,还需要多加练习。
思考及遇到的几个问题:
1、慢指针最终指向待删除元素还是其上一个元素?如果我们将慢指针指向删除元素,那么如何将其上一个节点的指针域指向其下一个节点,达到将其删除的目的。所以,我们应该将慢指针最终指向待删除元素的上一个元素。
2、特例情况?在n小于链表长度时,上述过程其实是非常容易实现的。但是在第一个例子就出Bug了([1], 1)链表只有一个元素,那么如何指向其上面一个元素?所以我们增加一个头结点使其指向链表的第一个元素。
3、返回什么元素?最开始想法是既然删除了节点,直接返回head即可。然而对于上述特例情况,此时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 *left,*right;
ListNode *Head = new ListNode(0);
Head->next = head;
left = right = Head;
for(int i=0;i<=n;i++){
right=right->next;
}
while(right!=nullptr){
right = right->next;
left = left->next;
}
ListNode *temp;
temp=left->next;
left->next=temp->next;
delete temp;
return Head->next;
delete Head;
}
};