Given a linked list, remove the nthnode 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:
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.
思路:
两个指针,p先走n步,然后q开始走。当p走到末尾时,q正好到了待删除节点。
#include <iostream>
using namespace std;
struct LinkNode
{
int data;
LinkNode *next;
LinkNode(int x):data(x),next(NULL){}
};
LinkNode * removeNthNodeFromEnd(LinkNode *head,int n)
{
if(head == NULL || n == 0)//防御性编程,增加健壮性
return head;
LinkNode *dummy = new LinkNode(-1);
dummy->next = head;
LinkNode *p,*q,*tmp;
p = dummy;
q = dummy;
//p先走n步
for(int i=0;i<n;i++)
{
if(p->next != NULL)
p = p->next;
else
return head;//如果n超过链表的长度,直接返回head
}
//然后p,q一起走
while(p->next)
{
p = p->next;
q = q->next;
}
//此时q指向的是待删除节点的前驱
tmp = q->next->next;
delete q->next;
q->next = tmp;
head = dummy->next;
delete dummy;
return head;
}