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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

LeetCode中的链表head是真实的头结点,不是虚拟的,需要自己定义一个虚拟头结点

双指针

  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 static ListNode removeNthFromEnd(ListNode head, int n) {
  13. ListNode virtual = new ListNode(0);
  14. virtual.next = head;
  15. ListNode current = virtual;
  16. ListNode last = virtual;
  17. ListNode pre = null;
  18. int i = 0;
  19. while(last != null) {
  20. if(i >= n) {
  21. pre = current;
  22. current = current.next;
  23. }
  24. last = last.next;
  25. i++;
  26. }
  27. pre.next = current.next;
  28. return virtual.next;
  29. }
  30. }