LeetCode19删除链表的倒数第N个结点
思路:
采用双指针,目标是让low指针停在要删除节点的前一个节点处,那么需要fast指针配合定位,以1->2->3->4->5,n=2为例,需要删除的目标节点是4,那么最终low定位在3,fast定位在5,从结尾往前推,当low初始停留在虚拟节点dummy处,fast要停留在2的位置,那我们首先需要一个单层循环把fast指针送过去,根据fast指针初始位置(dummy)和目标位置(2),fast要往前跳两次,由此得出循环条件 i=0;i<n;i++;后续fast和low保持固定间隔同步往前跳,直到fast指针跳到链表最后一个节点(5),停止,删除节点4
在删除操作这需要考虑一些特殊情况,最开始,我只考虑了删除中间节点,所以删除语句用的是low->next=fast;对于中间节点能够正确删除,但是对于删除头节点,比如【1】,n=1的情况就无法正确删除,因为fast可能停留在删除目标节点的后一个也可能停留在删除目标节点本身,fast的不确定性导致了删除语句没办法用fast来参与删除,但是low一定会定位在删除目标节点前一个节点,那么我们可以用**low->next=low->next->next;**进行删除
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode* dummy=(struct ListNode*)malloc(sizeof(struct ListNode));//创建虚拟头节点以应对删除头节点的情况
dummy->next=head;
struct ListNode *low=dummy;
struct ListNode *fast=dummy;
for(int i=0;i<n;i++)
{
fast=fast->next;
}
while(fast->next!=NULL)
{
low=low->next;
fast=fast->next;
}
low->next=low->next->next;
return dummy->next;
}