/**************************************************************************
*
* 19. [Remove Nth Node From End of List](https://leetcode.com/problems/remove-nth-node-from-end-of-list/)
*
* Given the head of a linked list, remove the nth node from the end of the list and return its head.
*
* Example:
* Input: head = [1,2,3,4,5], n = 2
* Output: [1,2,3,5]
*
**************************************************************************/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode NODE;
///
///
/// Approach 1:
int lenList(NODE *head) {
int len = 0;
while (head) {
len++;
head = head->next;
}
return len;
}
NODE *removeNthFromEnd(NODE *head, int n){
int len = lenList(head);
if (len < 1 || n < 1 || n > len) return head;
NODE dummy;
dummy.next = head;
NODE *pre = &dummy;
int step = len - n;
for (int i = 0; i < step; i++)
pre = pre->next;
NODE *del = pre->next;
pre->next = del->next;
free(del);
return dummy.next;
}
///
///
/// Approach 1:
NODE *removeNthFromEnd(NODE *head, int n){
if (NULL == head || n < 1) return head;
NODE dummy;
dummy.next = head;
NODE *pre = &dummy;
NODE *tail= &dummy;
for (int i = 0; i < n; i++) {
if (NULL == tail) return head; //out of range
tail = tail->next;
}
while (tail->next) {
pre = pre->next;
tail = tail->next;
}
NODE *del = pre->next;
pre->next = del->next;
free(del);
return dummy.next;
}