天天看点

链表-双指针-力扣19. 删除链表的倒数第 N 个结点1. 题目2. 思路3. 代码

1. 题目

题目链接: 19. 删除链表的倒数第 N 个结点.

2. 思路

  • 双指针:定义两个指针,fast和slow,先让fast向前移动N次,然后再一起移动到fast为最后一个节点,此时slow在被删除的倒数第N个节点的前一个节点,只需要slow.next = slow.next.next即可。
当被删除的是head的时候,即N与链表的节点数量一样的时候,此时移动完成后,fast已经为null,因此只需要将head向后移动一次即可,即head = head.next;

3. 代码

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if (head.next == null) return null;
        // 定义两个指针
        ListNode slow = head;
        ListNode fast = head;
        // 让快的指针前进n个
        while (n > 0) {
            fast = fast.next;
            n--;
        }
        // 同时移动slow和fast到链表末尾
        while (fast != null && fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }
        // 如果删除的是头结点则单独考虑
        if (fast == null) head = head.next;
        else slow.next = slow.next.next;
        return head;
    }
}