Description:
Given a linked list, remove the nth node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Try to do this in one pass.
删除从链尾开始算起的第N个节点,重点就是在于如何找到从链尾开始算起的第N个节点
Solution:
1、采用常规的方法,先从链头开始遍历一遍元素,得到总链表的长度len,这样再跟n进行计算,就可以将从链尾算起的第n个节点换算为从链头开始算起的第len+1-n个节点。
2、采用快慢两个指针,将快指针提前先走n步,之后两个指针同时行走,当快指针到达链尾时(fast==NULL),那么慢指针所在的节点就为从链尾数起的第n个节点。
Code:
version1:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* temp=head;
int count=0;
while(temp)
{
temp=temp->next;
count++;
}//count the length of link
n=count-n+1;
temp=head;
ListNode* f=NULL;
int cur=1;
while(cur!=n)
{
f=temp;
temp=temp->next;
cur++;
}//find the needed node
if(f==NULL)
{
head=head->next;
delete temp;
}//if the deleted node is original head node
else
{
f->next=temp->next;
delete temp;
}
return head;
}
};
version2:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* fast=head;
ListNode* slow=head;
ListNode* pre=NULL;
while(n--)
{
fast=fast->next;
}
while(fast)
{
fast=fast->next;
pre=slow;
slow=slow->next;
}
if(slow==head)
{
head=head->next;
delete slow;
}
else
{
pre->next=slow->next;
delete slow;
}
return head;
}
};