19 Remove Nth Node From End of List
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.
Solution:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *p1 = dummy, *p2 = dummy;
for ( int i = 0; i <= n; i++ ) p1 = p1->next;
while ( p1 != NULL ) {
p1 = p1->next;
p2 = p2->next;
}
p2->next = p2->next->next;
return dummy->next;
}
};
Use the following examples to determine some of the boundary condition and corner case.
/**
* n = 2
* dummy0 1 2 3 4 5 NULL
* p1 p1'
* p2 p2'
*/
/**
* n = 5
* dummy0 1 2 3 4 5 NULL
* p1(')
* p2(')
*/
find n-th node in a linked list.
// find the n-th node in the linked list
ListNode *p1 = head;
for ( int i = 1; i <= n-1; i++ ) p1 = p1->next;
count the number of nodes in a linked list
// icount is the number of nodes in a linked list
ListNode *p3 = head;
int icount = 0;
while ( p3 != NULL ) {p3 = p3->next; icount += 1;}