题目:
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.
There are two ways the first one is two pass the second one is two pass.
It’s straightforward to think about the two pass, the first thing coming to my head is the length of the List, then calculate the location of the specific node and remove it.
java的引用问题,two pass 采用一个pointer, one pass 采用两个pointer.
一个新的引用指向一个对象,引用被操作后的结果会影响其所指的对象。
two pass :
public class Remove {
public static ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy=new ListNode(0);
int length=0;
ListNode first=head;
while(first!=null){
length++;
first=first.next;
}
length-=n;
dummy.next=head;
first=dummy;
while(length>0){
length--;
first=first.next;
}
first.next=first.next.next;
return dummy.next;
}
}
one pass:
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy=new ListNode(0);
ListNode first,second;
dummy.next=head;
first=dummy;
second=dummy;
for(int i=0;i<=n;i++){
first=first.next;
}
while(first!=null){
first=first.next;
second=second.next;
}
second.next=second.next.next;
return dummy.next;
}
}
利用两个指针的长度差,一个指针的顺序就相当于两一个指针的倒序,来计算出被剔除点所在的位置。
first=first.next 这样的操作并不会影响到原对象。
reference:https://leetcode.com/articles/remove-nth-node-end-list/