19.删除链表的倒数第N个节点
题目描述:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例:
思路:
使用双指针,先定义一个虚拟头节点指向head,然后定义两个指针(fast和slow),如果要删除倒数第n个节点,让fast移动n+1步,然后让fast和slow同时移动,直到fast指向链表末尾。此时slow所指的就是需要删除的结点,删掉即可。
示意图:
以力扣给出的第一个示例为例
代码如下:
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
ListNode *dummyNode = new ListNode();
dummyNode->next = head;
ListNode *fast = dummyNode;
ListNode *slow = dummyNode;
//fast先走n步
while (n-- && fast != NULL) {
fast = fast->next;
}
fast = fast->next; //fast 走n+1 步
//fast slow 一起向前移动,直到fast为空
while (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
//删除slow的下一个结点
slow->next = slow->next->next;
return dummyNode->next;
}
};