给定一个单链表,使用高效的算法找出中间那个结点。
思路:使用龟兔赛跑算法,使用两个指针,一个步长大,一个步长小,当步长大的到达尾巴,步长小的正好是一半。
代码如下:
方法一:此时截取的是从中间开始(包括中间节点),右边一半
ListNode* midNostList(ListNode* head){
ListNode* slow=head;
ListNode* fast=head;
while (fast&&fast->next){
slow = slow->next;
fast = fast->next->next;} return slow;}
方法二:此时截取的是从中间开始(不包括中间节点),右边一半
ListNode* midNode(ListNode* p){
ListNode* fast=p;
ListNode* slow=p;
while(fast->next!=NULL&&fast->next->next!=NULL){
//奇数时指向中间,偶数时指向中间偏右那个
fast=fast->next->next;
slow=slow->next;
}
fast=slow->next;
slow->next=NULL;
return fast;
}