题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
复杂度保证为o(n)
示例
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
n保证是有效的
思路
复杂度为o(n),很明显,只允许我们遍历一遍链表。我们采用双指针,head2指向第n+1个节点,head1指向头节点,然后两个指针同时向后遍历直到head2.next为空,那么此时head1就是倒数第n+1个节点,自己去画一下图比较好理解,下面直接上代码。
代码
public class problem19 {
// Definition for singly-linked list.
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
//删除倒数第n个元素,保证n有效
public ListNode removeNthFromEnd(ListNode head, int n) {
//一共两个指针
ListNode head1=head;//保存前面的指针
ListNode head2=head;//保存与head1相距n的指针
//首先找到第n个链表节点
while(n!=0&&head2!=null){
head2=head2.next;
n--;
}
//特殊情况,链表一共只有n个节点
if(head2==null) return head.next;
// System.out.println("head2:"+head2.val);
//head1,head2同步向后遍历
while(head2.next!=null){
head1=head1.next;
head2=head2.next;
}
//删除节点
head1.next=head1.next.next;
return head;
}
public static void main(String[] args) {
problem19 pro=new problem19();
ListNode a=new ListNode(1);
a.next=new ListNode(2);
a.next.next=new ListNode(3);
a.next.next.next=new ListNode(4);
a.next.next.next.next=new ListNode(5);
ListNode b=pro.removeNthFromEnd(a, 3);
while(b!=null){
System.out.println(b.val);
b=b.next;
}
}
}