删除链表的倒数第N个节点

题目描述

来源于 https://leetcode-cn.com/

给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

解法:

快慢指针,先让快指针先走 n 步,然后慢指针开始出发,当快指针到达尾部的时候,慢指针就处于倒数第 n 个节点处。要删除节点 node,需要得到 node 前一个节点。因此,可以考虑让 fast 多走一步,但是如果要删除的实际上是头结点呢,所以增加一个伪结点是比较方便的做法。

class Solution {
public:
    ListNode *removeNthFromEnd(ListNode *head, int n) {
        ListNode dummy(-1);
        dummy.next = head;
        ListNode *fast = &dummy, *slow = &dummy;
        for (int i = 0; i < n; i++) {
            fast = fast->next;
        }

        while (fast->next) {
            fast = fast->next;
            slow = slow->next;
        }

        ListNode *next = slow->next;
        slow->next = slow->next->next;
        delete next;
        return dummy.next;
    }
};