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个结点,特殊情况是链表只有一个结点时或者倒数第N个结点就是首结点
时要注意处理,整个算法时间复杂度O(N):
struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
if(head == NULL || n < 0){
return NULL;
}
struct ListNode *p = NULL, *fast = NULL, *tmp = NULL;
p = head;
fast = head;
while(fast && n){
fast = fast->next;
n --;
}
if(n == 0 && fast == NULL)
{
//remove header
head = p->next;
free(p);
return head;
}
else if(n != 0 || fast == NULL)
{
//invalid n
return NULL;
}
while(fast){
tmp = p;
p = p->next;
fast = fast->next;
}
tmp->next = tmp->next->next;
free(p);
return head;
}