来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

描述

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

示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:
给定的 n 保证是有效的。

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

题解

双指针法,一遍扫描

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode removeNthFromEnd(ListNode head, int n) {
  11. ListNode dummy = new ListNode(0);
  12. dummy.next = head;
  13. ListNode first = dummy, second = dummy;
  14. for (int i = 1; i <= n + 1; i++) {
  15. first = first.next;
  16. }
  17. while (first != null) {
  18. first = first.next;
  19. second = second.next;
  20. }
  21. second.next = second.next.next;
  22. return dummy.next;
  23. }
  24. }

复杂度分析

  • 时间复杂度:19. 删除链表的倒数第N个节点(Remove Nth Node From End of List) - 图1,对含有L个结点的列表进行了一次遍历,因此时间复杂度为19. 删除链表的倒数第N个节点(Remove Nth Node From End of List) - 图2
  • 空间复杂度:19. 删除链表的倒数第N个节点(Remove Nth Node From End of List) - 图3,只用了常量级的额外空间。