链表的中间结点 (3.23leetcode每日打卡)

Posted ZLJ_Nice

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表的中间结点 (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 }

 

 
 

以上是关于链表的中间结点 (3.23leetcode每日打卡)的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 链表 - 链表的中间结点, leetcode 876

《LeetCode之每日一题》:109.删除链表的倒数第 N 个结点

LeetCode 链表的中间结点

LeetCode876. 链表的中间结点

LeetCode876 链表的中间结点

LeetCode 876——链表的中间结点