给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
leetcode这道链表删除节点题中等难度,这个题挺好解的,两种解法:
对链表进行两次扫描,第一次扫描得到链表的长度,然后第二次就可以确定要删除节点的位置并记录前驱阶段,这种方法时间复杂度O(n),空间O(1),这种方法code比较简单,就不贴了。
我们主要看进阶的要求,让我们只扫描一次成功删除节点。我先贴一下运行截图:
我们想象一个场景,一对平行线整体移动,是不是平行线之间的距离不会发生变化,同样的道理,我们用俩指针初始化为head,然后一个指针跑n-1次,这样两个指针的距离就是n,然后两个指针同时跑,当先n步的指针为最后一个节点了,后一个就是要删除的节点了呗。
//两个指针一起跑就行了呗
public ListNode removeNthFromEnd(ListNode head, int n) {
//保证了n的有效
ListNode p = head;
ListNode q = head;
ListNode t = head ;
while (--n>0){
p = p.next;
}
while(p.next != null && q.next != null){
t = q;
p = p.next;
q = q.next;
}
if (q == head){
head = head.next;
}else{
t.next = q.next;
}
return head;
}