https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode a = head;
ListNode b = head;
ListNode p = null;
int time = 0;
while(null != a.next){
time++;
a = a.next;
if(time >= n){
p = b;
b =b.next;
}
}
if(null == p){
return b.next;
}
p.next = b.next;
return head;
}
}
初始状态:
time = 0 , n = 4
A
1 2 3 4 5
P B
第一趟:
time = 1 , n = 4
A
1 2 3 4 5
P B
第二趟:
time = 2 , n = 4
A
1 2 3 4 5
P B
第三趟:
time = 3 , n = 4
A
1 2 3 4 5
P B
第四趟:
time = 4 , n = 4
A
1 2 3 4 5
P B
循环结束,B指向要删除的节点,P为其前置节点。
如果循环结束后P仍为null,说明P和B都没有动,而A此时已经到达了链表的最后一个节点,此时time=length-1,仍然小于n
而n最大值为链表长度length,因此此时n为链表长度length,也就是要删除倒数第length个元素,即第一个元素,此时将返回head的next即可。
初始状态:
time = 0 , n = 3
A
1 2 3
B
P
第一趟:
time = 1 , n = 3
A
1 2 3
B
P
第二趟:
time = 2 , n = 3
A
1 2 3
B
P