19. 删除链表的倒数第N个节点
问题
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
思路一
第一反应是扫描链表长度length,删除倒数第n个,也就是证书第length-n+1个
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head==null)
return null;
int length=0;
ListNode temp=head;
while(temp!=null) {
length++;
temp=temp.next;
}
int index=length-n+1;
if(index==1)
return head.next;
temp=head;
for(int i=1;i<index-1;i++)
temp=temp.next;
ListNode remove=temp.next;
temp.next=remove.next;
remove.next=null;
return head;
}
}
思路二
思路一遍历了两次,设置三个引用p,q,r,r引用先走n步,p引用的next指向q,然后三个引用同时移动,当r走到末尾时,q即为要删除的节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode p=new ListNode(-1);
ListNode q=head;
ListNode r=head;
p.next=q;
for(int i=1;i<=n;i++)
r=r.next;
if(r==null) {
return head.next;
}
while(r!=null) {
r=r.next;
q=q.next;
p=p.next;
}
p.next=q.next;
q.next=null;
return head;
}
}