19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) (leetcode-cn.com)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
// 思路:
// 利用双指针,先让快指针先走n步
// 然后快指针和慢指针同时走,直到快指针指向了末尾结点
// 此时慢指针指向就是要删除结点的前一个结点
// 执行删除结点操作,返回链表头结点即可
// 当使用虚拟头结点后解题稍微有变化
// 因为虚拟头结点相当于链表多了一个结点,所以要让快指针多移动一次
// 同时快慢指针同时移动的条件不是 快指针指向尾结点就可以了,而是指向尾结点的下一个,也就是NULL
// 最后输出虚拟头结点的地址域即可
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode fakehead;
fakehead.next = head;
struct ListNode* slow = &fakehead;
struct ListNode* fast = &fakehead;
while(n-- && fast != NULL) {
fast = fast->next;
}
fast = fast->next;
while(fast != NULL) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return fakehead.next;
}