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个结点位置之后慢指针才开始走,当快指针到达尾部时,慢指针刚好到待删除的结点
时间复杂度O(length linklist),空间复杂度O(1)
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
if(head==NULL)
return NULL;
struct ListNode *fast=head,*slow=head;
int i;
while(fast&&i!=n) //
{
i++;
fast=fast->next;
}
if(i<n) //说明删除的结点不存在
return head;
if(fast==NULL) //说明n等于链表的长度,删除第一个结点
return head->next;
while(fast->next!=NULL) //定位到待删除的结点的前一个结点
{
fast=fast->next;
slow=slow->next;
}
slow->next=slow->next->next;
return head;
}
特别注意:
while循环中是指针往后走并且计算数量i,如果当循环结束时,如果i还不能到达n个的话,说明链表不到n个元素,那么就不用进行删除直接返回链表头了,即第一个条件if(i<n)
第二种情况是到达的时候i==n,同时也是runner==null,说明链表刚好n个元素,那么我们要删除第一个元素,也就是链表头,等价于直接返回第二个元素,所以是return head.next