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.
题意:意思是给定一个单链表,删除从表尾开始数的第n个数字,并返回删除后的链表。我开始的做法比较简单,先遍历一遍链表,得到总长len,然后再计算得到顺序删除的值len-n,最后在遍历一次删除。后来看了别人的解法:用两个指针,一个快指针先走n步,一个慢指针从头开始走,这样当快指针走到尾部的时候,慢指针所指的就是要删除元素的前一个元素。代码:
/**
* 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 *pre=head;
ListNode *t1=head,*t2=head;
int i=0;
while(i<n)
{
t1=t1->next;
i++;
}
if(t1==NULL)return head->next;
while(t1!=NULL)
{
if(t2!=head)pre=pre->next;
t1=t1->next;
t2=t2->next;
}
pre->next=t2->next;
return head;
}
};
本文介绍了一种高效删除链表中倒数第N个节点的方法。通过使用两个指针,一个快指针先向前移动N步,随后两个指针同步移动直至快指针到达链表末尾。此时慢指针指向待删除节点的前一个节点,从而实现O(n)时间内完成删除操作。
655

被折叠的 条评论
为什么被折叠?



