1. 题目
-
给你一个链表,删除链表的倒数第
n
个结点 -
返回链表的头结点
2. 图解
-
代码实现
public static ListNode removeNthFromEnd(ListNode head, int n) { // 判断该链表是否为 null if (head == null || head.next == null) return null; ListNode dummy = new ListNode(0); // 创建一个哑结点,记录头结点的地址 dummy.next = head; ListNode fast = dummy, low = dummy;// 初始化快慢指针 int step = 0; while (fast.next != null) {// 快指针移动到尾节点时,跳出循环 // 当快指针移动 n个节点后,慢指针后移 if (step >= n) low = low.next; fast = fast.next;// 快指针后移 step++; } low.next = low.next.next; // 删除倒数第 n个节点 return dummy.next; // 返回头结点 }
-
为什么要设立哑结点?直接返回 head不好吗?
-
当要删除第一节点时,low = dummy
low.next = low.next.next
-
删除后,dead会丢失。low、dummy都指向了 新的头结点
-
返回 dummy.next 即可
-