描述
给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例
示例1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例2:
输入:head = [1], n = 1
输出:[]
提示
- 链表中结点的数目为 sz
- 1 <= sz <= 30
- 0 <= Node.val <= 100
- 1 <= n <= sz
解题思路
- 声明一个快指针,一个慢指针,初始时,都指向头节点
- 快指针先向后移动 n 个节点,然后与慢指针一起移动。当快指针指向最后一个节点时,慢指针指向倒数第 n各节点的前一个节点。
- 删除慢指针指向的后一个节点即可。
- 为了能删除头节点,声明一个节点 headNode,这个节点的 next 指向头节点,算法从 headNode 开始
代码
/**
* 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 preHead = new ListNode();
preHead.next = head;
ListNode slow = preHead, faster = preHead;
for (int i = 0; i <= n; i++) {
faster = faster.next;
}
while (faster != null) {
slow = slow.next;
faster = faster.next;
}
slow.next = slow.next.next;
return preHead.next;
}
}