力扣刷题笔记【双指针篇】 → 19. 删除链表的倒数第 N 个结点

902 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目

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

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

示例

image.png

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

提示

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

解题思路

双指针

根据提示可以得知链表中节点数最少为1,为了避免链表长度为1且需要删除的情况,我们需要构造一个虚拟链表头节点将其连接起来,使得我们最终返回时有对应的入口。

同时,我们还需要创建快慢两个节点,用来计算是否达到需要删除的位置,方便删除节点。

  1. 创建虚拟头节点hummy
  2. 创建快慢两个节点slow, fast

Kapture 2021-10-31 at 17.18.53.gif

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 虚拟头节点,将其与head节点进行关联
        ListNode hummy = new ListNode();
        hummy.next = head;
        
        // 快慢节点
        ListNode slow = hummy, fast = hummy;

        // 根据需要计算倒数的位数,使得 fast 节点提前移动 n 位
        while(n-- > 0){
            fast = fast.next;
        }

        // 两个节点同时移动,直至 fast 下一节点为空
        while(fast.next != null){
            slow = slow.next;
            fast = fast.next;
        }

        // 删除目标节点
        slow.next = slow.next.next;

        // 返回结果
        return hummy.next;
    }
}

 复杂度分析

  •   时间复杂度:O(N)O(N)
  •   空间复杂度:O(1)O(1)

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!

题目出处: leetcode-cn.com/problems/re…