写点什么

【刷题记录】19. 删除链表的倒数第 N 个结点

作者:WangNing
  • 2022 年 7 月 23 日
  • 本文字数:818 字

    阅读完需:约 3 分钟

一、题目描述

来源:力扣(LeetCode)


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



输入: 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 进阶: 你能尝试使用一趟扫描实现吗?

二丶思路分析

在删除节点的时候,我们需要知道节点的长度才能确定倒数第 n 个节点的位置。


如果遍历一次,在查找一次,也能做到。题目进阶的要求是尝试一次扫描来实现。


那么如果一次扫描来实现我们可以借助于类似窗口的概念来实现


  • 这个窗口我们让它是定长 n 的一个窗口,

  • 窗口左边为链表的起点。

  • 然后移动这个窗口,当窗口右边移动到链表的末端节点时候为空时候,窗口的左边指向的即是要被删除的 倒数第n个节点


如示例 1


三、代码实现

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode() {} *     ListNode(int val) { this.val = val; } *     ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution {    public ListNode removeNthFromEnd(ListNode head, int n) {        ListNode dummy = new ListNode(0, head);        ListNode R = head;        ListNode L = dummy;        for (int i = 0; i < n; ++i) {            R = R.next;        }        while (R != null) {            R = R.next;            L = L.next;        }        L.next = L.next.next;        ListNode res = dummy.next;        return res;    }}
复制代码

复杂度分析

  • 时间复杂度:,其中 n 是链表的长度

  • 空间复杂度:

运行结果


总结

这个题目也是利用双指针 + 窗口都类似概念(定长的),利用这个窗口的长度和移动,来确定倒数第n个节点所在的位置。来达到一次的遍历实现。

发布于: 刚刚阅读数: 3
用户头像

WangNing

关注

还未添加个人签名 2020.10.13 加入

一个只想提(快)升(乐)自(摸)我(鱼)的混子选手~

评论

发布
暂无评论
【刷题记录】19. 删除链表的倒数第 N 个结点_7月月更_WangNing_InfoQ写作社区