给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
题目大意
删除单链表的倒数第N个结点,注意:输入的N都是合法,在一次遍历中完成操作。
解题思路
先让一个指针走找到第N个节点,然后再让一个指针指向头结点,然后两具指针一起走,直到前一个指针直到了末尾,后一个指针就是倒数第N+1个结点,删除倒数第N个结点就可以了。
代码实现
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pa=head;
ListNode pb=head;
//注意:pa指向第n+1个节点
for (int i=0;i<n&&pa!=null;i++){
pa=pa.next;
}
if (pa == null) {
head = head.next;
return head;
}
// pb与pa相差n-1个结点
// 当pa.next为null,pb在倒数第n+1个位置
while (pa.next!=null){
pa=pa.next;
pb=pb.next;
}
pb.next=pb.next.next;
return head;
}
}