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.
思路:
快慢指针指向头结点,快指针先移动n个结点,再和慢指针一起移动。当快的到尾部,慢的正好到倒数第n个。
需要注意的是如果要删除的是第一个结点,和后面的略有不同。以此考虑加一个指向头结点的结点指针。
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode *phead=new ListNode (0);//定义一个指向头结点的结点指针
phead->next=head;
ListNode *p=phead,*q=phead;
int i=0;
while(i<n)
{
i++;
q=q->next;
}
while(q->next)
{
q=q->next;
p=p->next;
}
ListNode* t=p->next;
p->next=t->next;
free(t);
return phead->next;
}
void main()
{
ListNode *head=new ListNode(1);
ListNode *p=head;
for(int i=2;i<=4;i++)
{
ListNode *q=new ListNode(i);
p->next=q;
p=q;
}
ListNode *res=head;
res=removeNthFromEnd(head,4);
for(int i=0;i<3;i++)
{
cout<<res->val<<" ";
res=res->next;
}
BTW:链表的创建使用比较生疏,所以在这个主函数中花了一些时间。很不应该。
一开始写法:
ListNode *head=new ListNode(1);
ListNode *p=head;
for(int i=2;i<=4;i++)
{
p=p->next;
p->val=i;
}
思考一下,这是错的。因为p->next是结点指针,怎么能给p->val赋值呢?