
利用快慢指针,快指针先走n步,慢指针才开始走,快指针走到终点时,慢指针所在的位置就是倒数n节点。
给你一个链表,删除链表的倒数第 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]提示:
sz1 <= sz <= 300 <= Node.val <= 1001 <= n <= szRelated Topics
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast = head;
ListNode slow = null;
int i = 1;
while (fast != null) {
if (i == n+1) {
slow = head;
}else if (i>n+1){
slow = slow.next;
}
fast = fast.next;
i++;
}
// 因为slow是删除节点的前一个,所以存在特殊情况
// 一、删除节点是第一个,slow为空,通过长度来判断这种情况
if (i - 1 == n) {
return head.next;
}
// 二。删除节点是头结点之前的,直接返回头结点
if (slow == null) {
return head;
}
// 删除节点slow.next
slow.next = slow.next.next;
return head;
}Post Views: 167