LC19-删除链表倒数第N个节点
题目: 给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点 。如图:
思路:
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
- 定义fast指针和slow指针,初始值为虚拟头结点,如图:
- fast首先走n + 1步 ,为什么是n+1呢?因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作),如图:
- fast和slow同时移动,直到fast指向末尾,如图:
- 删除slow指向的下一个节点,如图:
双指针写法(C):
;struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
typedef struct ListNode ListNode;
ListNode *H=(ListNode *)malloc (sizeof(ListNode));
H->next=head;
ListNode *fast=H;
ListNode *slow=H;
n=n+1; //fast走n+1步
while(n-- && fast!=NULL){
fast = fast->next;
}
//确定好fast位置后,fast和slow同时移动
while(fast != NULL){
fast=fast->next;
slow=slow->next;
}
slow->next=slow->next->next; //可以改成fast=slow->next; slow->next=fast->next;free(fast);
return H->next;
}