该题目用到的思想为虚拟头节点以及快慢指针,如不熟悉这两个方法,请参见我的前文。
给出代码:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* xHead = new ListNode(0);
xHead->next = head;
ListNode* nod1 = xHead;
ListNode* nod2 = xHead;
//构造类似于快慢指针的,使两个节点之差为n-1;
for(int i = 0;i<n;i++)
nod2 = nod2->next;
//让快指针到达最后一个节点,此时慢支针到达待删除节点的前一个节点
while(nod2->next != 0)
{
nod1 = nod1->next;
nod2 = nod2->next;
}
//删除要题目要求删除的节点
ListNode* deleteN1 = nod1->next;
nod1->next = deleteN1->next;
delete deleteN1;
//删除虚拟头节点,释放空间
ListNode* head_out = xHead->next;
delete xHead;
return head_out;
}
};