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

315 阅读1分钟

在正文的第一句加入: 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目描述

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

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

示例 1:

image.png

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

提示:

链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz

题解

1.使用快慢指针,快指针领先慢指针n个位置,因此当快指针到达链表尾部时,慢指针刚好到达倒数n+1节点,此时只要把慢指针的下一个节点变成下下个节点就可以了.

注意点:当数组是由一个的情况下,那么一定会移除唯一一个元素.因此在右指针移动阶段如果判断出当前元素为null(超过链表尾部),那么直接将该元素去除(return head.next)

public ListNode removeNthFromEnd(ListNode head, int n) {
        // while 进行下一个节点是否存在循环
        ListNode left = head;
        ListNode right = head;
        ListNode temp;
        // 将右指针放到左指针的第n个位置
        while (null != right) {
            if (0 != n) {
                right = right.next;
                n --;
                // 当在右指针单独移动当中遇到结尾(溢出的元素时链表倒数第一位)时,直接返回head.next
                if (null == right) {
                    return head.next;
                }
                continue;
            }
            // 右指针找到链表结尾
            if (null ==right.next) {
                // 左指针直接跳过下一个节点,连接下下个节点
                left.next = left.next.next;
                break;
            }
            right = right.next;
            left = left.next;
        }
        return head;
    }

image.png