快慢指针
面试中经常会遇到如何查找单链表的中间节点问题。这一问题通常会采用快慢指针来解决。
可分为两种情况,一种是查找第n/2+1个节点,另一种是查找第n/2个节点,其中n为链表的长度。下面将分别给出这两种查找的实现。
1)求n/2 + 1
ListNode *fast = head, *slow = head;//, *prev = NULL;
while( fast && fast->next ) {
//prev = slow;
slow = slow->next;
fast = fast->next->next;
}
//return prev;
return slow;
while( fast && fast->next ) {
//prev = slow;
slow = slow->next;
fast = fast->next->next;
}
//return prev;
return slow;
分析:
当n为偶数时,fast==NUL,退出while循环;
当n为奇数时,fast->next = NULL,退出while循环。
ListNode *fast = head, *slow = head;
if(fast==NULL) return NULL;
while( fast->next && fast->next->next ) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
if(fast==NULL) return NULL;
while( fast->next && fast->next->next ) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
分析:
当n为偶数时,fast->next->next==NUL,退出while循环;
当n为奇数时,fast->next = NULL,退出while循环。
与n/2+1情况相比,n/2情况下,每次多探测一个元素,因此提前一步结束循环,即slow少走一步。