给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
- 给定的 n 保证是有效的。
进阶:
- 你能尝试使用一趟扫描实现吗?
来源:力扣(LeetCode)
自己第一次写的代码:
思路就是先遍历一遍,获得链表的节点数目,节点数目减去n得到要删除节点的索引值。然后再遍历一遍删掉对应索引的节点。注意如果遍历完了还没有返回,说明要删除的是头节点。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int num=0;
ListNode temp=head;
while(temp!=null){
num++;
temp=temp.next;
}
int index=num-n;
temp=head;
int index2=0;
while(temp!=null){
index2++;
if(index2==index){
temp.next=temp.next.next;
return head;
}
temp=temp.next;
}
return head.next;
}
}
更巧妙的一次遍历的方法:由于我们需要找到倒数第n个节点,因此我们可以使用两个指针slow和fast同时对链表进行遍历,并且fast比slow超前n-1个节点。这样当fast遍历到链表的末尾时,slow就恰好处于倒数第n个节点。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast=head,slow=head,temp=null;
for(int i=0;i<n-1;i++){
fast=fast.next;
}
while(fast.next!=null){
fast=fast.next;
temp=slow;
slow=slow.next;
}
if(temp!=null){
temp.next=slow.next;
return head;
}else{
return head.next;
}
}
}