链表的中间结点 (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

时间: 2024-11-09 10:42:47

链表的中间结点 (3.23leetcode每日打卡)的相关文章

找链表的中间结点

//找链表的中间结点 /* 已知单链表L,编写算法找出该链表的中间位置的结点. 思考: 1.一种想法就是从头遍历到尾部,记录长度.随后再次遍历一次,直到长度的二分之一即找到.时间复杂度为O(3n/2) 2.另一种想法:设置快慢指针,快指针一次走两步,慢指针一次走一步,当快指针走到NULL的时候,慢指针的位置就是链表的中间位置 本程序使用第二种想法 */ #include <iostream> #include <string> using namespace std; int L_

LeetCode 876——链表的中间结点

1. 题目 给定一个带有头结点 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.n

快速找到未知长度的单链表的中间结点

问题描述:快速找到未知长度的单链表的中间结点 普通方法:首先遍历一遍单链表,以确定单链表的长度L,然后再从头结点出发,循环L/2次,找到单链表的中间结点. 高效算法(快慢指针):设置两个指针,*search,*mid都指向单链表的头结点.其中*search指针的移动速度是*mid指针移动速度的2倍.当*search移动到链表末尾时,*mid刚好在中间结点.(标尺的思想) //快速得到单链表的中间结点 Status GetMidNode(LinkList &L,int &e){ LinkLi

Leetcode daily 20/03/23 链表的中间结点

链表的中间结点 -题目- 给定一个带有头结点 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

剑指offer-求链表的中间结点

一次遍历即可. /** * 定义两个指针,同时从链表的头指针出发,一个指针一次走一步,另一个指针一次走两步, * 当快指针到达链表的尾部,慢指针到达链表中间位置 * @param head * @return 链表中间结点 */ public ListNode findCenterNode(ListNode head) { if(head == null) return null; ListNode fast = head; ListNode slow = head; while(fast !=

找出链表的中间结点

思路:定义两个快慢指针,快指针一次走两步,慢指针一次走一步,当快指针到达尾结点时,慢指针刚好为中间结点,这里需要区分两种情况,当链表中结点数为奇数时,慢指针刚好到达中间结点:当链表中结点数为偶数时候,中间结点有两个,返回一个. public static ListNote findMidNode(ListNote headNote){ if(headNote==null){ return null; } ListNote firstNote = headNote;//快指针 ListNote s

英语词汇(每日打卡)

18.7.1 Words pseudo(syu duo) code internationalization literal collaborate(ke la be rea te) Syntax(sin tax) enumeration (in 牛魔 ration) 原文地址:https://www.cnblogs.com/PROJECT-IDOLPROGRAM/p/9251835.html

面试2(每日打卡)

1.css引入样式的方式有哪几种? 1><link href=" ">外部引入样式 2><div style=" "></div> 行内引入 3><head>内部引入样式 <style></style> </head> 2.说说比较css中各种选择器的优先级? !important >行内style  > #id > .class > div

面试3(每日打卡)

1.举例3种强制类型转换和2种隐式类型转换? 强制:parseInt ,parseFloat  , number , 隐式:== , ===  , 2.split()和join()的区别? split()是将字符串切割成数组的形式, join()是将数组转换成字符串 3.数组的unshift()是从头部添加,shift()是从头部删除 4.ajax请求的时候get和post方式的区别? 5.call和apply的区别? Object.call(this.obj1,obj2,obj3) Objec