题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
思路
关键是要找到目标结点的前一个位置,
双指针,当快指针到末尾null时,慢指针要位于目标结点的前一个结点
如图快指针先走N+1步即可
结束条件:fast为空
设置虚拟头节点dummy,返回dummy.next即为头节点
代码
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1,head);
ListNode fast = dummy;
ListNode slow = dummy;
//快指针先移动N+1步
for(int i=1;i<=n+1;i++){
fast = fast.next;
}
//快慢指针同时移动
while(fast != null){
fast = fast.next;
slow = slow.next;
}
//移除目标指针
slow.next = slow.next.next;
//返回头节点
return dummy.next;
}
}