题目地址(19. 删除链表的倒数第 N 个结点)

https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

题目描述

  1. 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
  2. 进阶:你能尝试使用一趟扫描实现吗?
  3. 示例 1
  4. 输入:head = [1,2,3,4,5], n = 2
  5. 输出:[1,2,3,5]
  6. 示例 2
  7. 输入:head = [1], n = 1
  8. 输出:[]
  9. 示例 3
  10. 输入:head = [1,2], n = 1
  11. 输出:[1]
  12. 提示:
  13. 链表中结点的数目为 sz
  14. 1 <= sz <= 30
  15. 0 <= Node.val <= 100
  16. 1 <= n <= sz

前置知识


公司

  • 暂无

思路

image.png

关键点

  • 定义快慢指针
  • 虚拟头结点

代码

  • 语言支持:Java

Java Code:

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode() {}
  7. * ListNode(int val) { this.val = val; }
  8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  9. * }
  10. */
  11. class Solution {
  12. public ListNode removeNthFromEnd(ListNode head, int n) {
  13. //定义一个虚拟头结点
  14. ListNode touNode = new ListNode(-1, head);
  15. //定义快慢指针 都指向头结点
  16. ListNode fast = touNode;
  17. ListNode slow = touNode;
  18. //让快指针执行n次
  19. while (n-- > 0) {
  20. fast = fast.next;
  21. }
  22. //当快指针.next不等于空时 快慢指针++ 加到最后时 快指针在队伍的最后端 慢指针在待删除的节点的前方
  23. while (fast.next != null) {
  24. fast = fast.next;
  25. slow = slow.next;
  26. }
  27. //使慢指针的下个节点 指向下个节点的下个节点
  28. slow.next = slow.next.next;
  29. return touNode.next;
  30. }
  31. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:19. 删除链表的倒数第 N 个结点(2) - 图2#card=math&code=O%28n%29&id=lF0ht)
  • 空间复杂度:19. 删除链表的倒数第 N 个结点(2) - 图3#card=math&code=O%28n%29&id=hKsEe)