Given a linked list, remove the nth node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Try to do this in one pass.
翻译 :删除掉单链表倒数第N个元素,N总是有效的 ,一次遍历。
Trick 在于使用两个指针,一个P1指向开头,另一个P2指向第N个结点,二者同时向后遍历,当P2达到TAIL时,P1也就到达了指定的结点。
PS:本来想不适用pre来保存前一个节点,单纯的使用delete O(1)的方法来写删除的,但是这种方法只适用于所删除的结点后面结点非空的情况。折腾了一番,还是乖乖写了pre结点。
http://www.jianshu.com/p/23e2affa80c5
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode (0);
dummy.next = head ;
ListNode pos = dummy;
ListNode pre = dummy;
int count = n ;
while(count>0)
{
pos=pos.next;
count--;
}
// 追踪到tail ,此时head 指向的是倒数第N个结点。
while(pos.next!=null)
{
head=head.next;
pos=pos.next;
pre=pre.next;
}
pre.next=head.next;
return dummy.next;
}
}