给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
输入:head = [1,2], n = 1
输出:[1]
思路:双指针法
1)指针fast:辅助slow找到倒数第n个节点
2)指针slow:进项删除节点(参考leetcode203)
解析:
关键:如何找到链表倒数第n个节点
fast和slow应该遍历到链表的什么位置
倒数第n个:从null开始数n次后的节点
本题关键结论:fast位于null,slow与fast应该相距n+1个位置,当fast移动到null时,slow则删除下一个结点
若要删除倒数第三个结点
0 → 1 → 2 → 3 → 4 → 5 → null
slow fast
头为边界:需要虚拟头结点dummy,因为可能会删除head,需要null
/**
* 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 dummy=new ListNode(0);
dummy.next=head;
ListNode fast=dummy;
ListNode slow=dummy;
//因为slow和fast相隔n+1个位置,所以先把fast向前移动n+1个位置
for(int i=1;i<=n+1;i++){
fast=fast.next;
}
while(fast!=null){
slow=slow.next;
fast=fast.next;
}
//当fast移动到了null时
slow.next=slow.next.next;
return dummy.next;
}
}