给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路:
倒数第n个节点获取只需要设置两个指针, 两个指针同时从head开始, b指针与a指针之间的长度为n,
然后ab指针同时往前走, 等到b指针走到末尾节点时,a指针即为倒数第n个节点
但是这一题要求的是:删除倒数第n个节点,换句话说, 我们要获取倒数第n+1个节点(即被删除节点的前一个节点),将其指针指向下一个的下一个。
另外,该题还有特殊情况,例如只有head的链表,b指针无法走到n+1位置的链表也要考虑进来。
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head.next == null && n == 1) {
return null;
}
ListNode p1 = head;
ListNode p2 = head;
while (true) {
p2 = p2.next;
n --;
if (n == 0) {
break;
}
}
if(p2 == null) {
return head.next;
}
while (p2.next!=null) {
p1 = p1.next;
p2 = p2.next;
}
p1.next = p1.next.next;
return head;
}