leetcode 19. Remove Nth Node From End of List-移除链表元素|双指针

来源:互联网 发布:移动互联网 数据 编辑:程序博客网 时间:2024/05/16 11:29
原题链接:19. Remove Nth Node From End of List

【思路】

如果移除正数第 n 个很容易,可是换做倒数第 n 个就变得有些挠头了。开始时候想着先遍历一遍,数出链表长度 m,然后在第 m - n + 1出做移除操作,可是题目要求只遍历一遍,那么这种思路肯定就要被 pass 了。我们需要换一种思路:

1. 声明两个指针fast 和 slow(假设都指向头结点,但是这个假设后面将会被推翻)

2. 先让 fast 移动 n 步

3. 然后 fast 和 slow 同时移动,直到 fast 指向空(即尾节点的下一个节点)

那么 slow 和尾节点的距离不就是 n 了吗?但是,显然上述思路还存在漏洞,我们必须要在使得 slow 处于倒数 n + 1 个位置才能将倒数第 n 个节点移除。很明显的一个特例我们可以假设刚好要将头结点移除(即长度为 n 的链表移除倒数第 n 个节点),为此我们需要申请一个新的节点 dummyHead 它的下一个节点指向 head:

    public ListNode removeNthFromEnd(ListNode head, int n) {        ListNode dummyHead = new ListNode(0), slow = dummyHead, fast = head;        dummyHead.next = head;        for (int i = 0; i < n; i++)            fast = fast.next;        while (fast != null) {            fast = fast.next;            slow = slow.next;        }        slow.next = slow.next.next;        return dummyHead.next;    }
207 / 207 test cases passed. Runtime: 1 ms  Your runtime beats 7.54% of javasubmissions.

1 0