(Good topic)快慢指针:链表的中间结点 (3.23leetcode每日打卡)

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
 
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

示例 2:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。

 
提示:

 给定链表的结点数介于 1 和 100 之间
思路:
学链表的时候听别人说,这好像是一道腾讯面试题,下面说思路。
search是快指针,mid是慢指针,mid移动一个,search就移动两个,search指针移动到结尾,mid就指向了中间结点,返回即可,不过这题头结点竟然存放了数据,所以判断一下如果head->next == NULL,直接返回头结点
还有两个思路就是先计数,用一个指针指向中间,或者导入数组寻找,不过效率都比快慢指针低
 1 struct ListNode* middleNode(struct ListNode* head)
 2 {
 3     struct ListNode *search;
 4     struct ListNode *mid;
 5     int mid_data;
 6 
 7     mid = search = head->next;
 8     if(mid == NULL)
 9     return head;
10     while(search->next != NULL)
11     {
12         if(search->next->next != NULL)
13         {
14             search = search->next->next;
15             mid = mid->next;
16         }
17         else
18         {
19             search = search->next;
20         }
21     }
22 
23     return mid;
24 }
 
 
原文地址:https://www.cnblogs.com/ZhengLijie/p/12550197.html