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.
The key of this problem is to locate the node that prior of the removing node:
There are two ways to locate:
solution_1: use two nodes: fast & slow node, make sure distance between these two nodes is equal to n, when fast node reach the end of linked, the slow node will be point to prior of removing node
solution_2: find length of linked list, locate the node prior of removing node by using (length-n+1)
Both solutions are worked and tested by LeetCode Online judgement.
See the source code in below:
/*Solution_1:
* key to solve:
* 1.Use two point of nodes: slow and fast
* 2.locate the the node prior of removing node
* 3.remove it
* */
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null ) return head;
if(head.next == null) return head.next;
ListNode slow = head;
ListNode fast=head;
//keep distance of slow and fast node in n
while(n>0){
fast = fast.next;
n--;
}
//check for case of removing beginning node of head
if(fast==null) return head.next;
//locate slow node prior of removing node
while (fast.next != null) {
slow = slow.next;
fast = fast.next;
}
slow.next=slow.next.next;
return head;
}
/*Solution_2:
* key to solve:
* 1.Find length of Linked list, since we are going to remove from end
* 2.locate the the node prior of removing node
* 3.remove it
* */
public ListNode removeNthFromEnd2(ListNode head, int n) {
if (head == null ) return head;
if(head.next == null) return head.next;
//find length of linkedlist
int length=0;
ListNode count = head;
while(count!=null){
count=count.next;
length++;
}
//check for case of removing head;
if (n == length) {
head = head.next;
return head;
}
//locate the node prior of removing node
ListNode cur = head;
ListNode beforeCur = null;
int m=length-n+1;
while (m > 1 && cur!=null) {
m--;
beforeCur = cur;
cur = cur.next;
}
//remove the node as requirement
beforeCur.next = beforeCur.next.next;
return head;
}