给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
方法一 两次循环
第一次 循环找出一共有多少个节点
第二次循环定位到要删除的节点的前一个节点
思路很简单 但是写起来要对单链表的每一次移动有清晰的了解
要注意需要设立一个初始节点 .next = 头结点
(为了方式要删除的节点为第一个节点)
再设立一个 临时节点p
第二次循环时临时节点的位置已经在了末尾
所以要重新赋值到头结点
ListNode dummy = new ListNode(0);
// dummy.next = head;
// ListNode first = head;
// int length = 0 ;
// while (first!=null){
// first = first.next;
// length++;
// }
// length = length-n;
// first = dummy;
// while(length>0){
// first = first.next;
// length--;
// }
// first.next = first.next.next;
// return dummy.next;
方法二
同样先设立一个初始的头结点。
因为只通过一次循环
所以设立两个节点
先将其中一个往前移动n个位置
然后同时将两个节点移动到相同的位置
此时seconde所在的位置就是要删除节点的前一个位置
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode first = dummy;
ListNode second = dummy;
for(int i = 0 ; i<n ; i++){
first = first.next;
}
while(first.next!= null){
first = first.next;
second = second.next;
}
second.next = second.next.next;
return dummy.next;