【手把手带你刷好题】—— 45.链表的中间节点(双指针)

举报
安然无虞 发表于 2022/05/27 00:09:06 2022/05/27
【摘要】 【前言】 今天是刷题打卡第45天! 2021还有20来天就要结束咯,时间过得真是快鸭。   原题:链表的中间节点(双指针)   示例1: 输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5]...

【前言】

今天是刷题打卡第45天!

2021还有20来天就要结束咯,时间过得真是快鸭。

 

原题:链表的中间节点(双指针)

 

示例1:


  
  1. 输入:[1,2,3,4,5]
  2. 输出:此列表中的结点 3 (序列化形式:[3,4,5])
  3. 返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
  4. 注意,我们返回了一个 ListNode 类型的对象 ans,这样:
  5. ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

 示例2:


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

思路(快慢指针):

本题采用“快慢指针”解决,慢指针一次走一步,快指针一次走两步,不过需要注意的是本题受到节点总数是奇偶的影响,当节点总数是奇数时,fast->next == NULL,slow就指向了中间结点;当节点总数是偶数时,fast == NULL,slow就指向了中间结点,所以循环条件有两个,但是循环条件的先后顺序也是有讲究的,不信你看代码。

代码执行:


  
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode* middleNode(struct ListNode* head){
  9. //两个指针的起始位置都是从头开始
  10. struct ListNode* slow = head;
  11. struct ListNode* fast = head;
  12. //注意循环条件不能写成fast->next && fast这种形式,原因在于fast走两步后可能就指向空了
  13. //再执行循环条件fast->next会导致空指针异常,越界了,但是fast写在前面就不会出现上述情况,因为&&存在短路求值
  14. while(fast && fast->next)
  15. {
  16. slow = slow->next;//slow每次走一步
  17. fast = fast->next->next;//fast每次走两步
  18. }
  19. return slow;//此时slow就指向中间节点
  20. }

结语

今天是刷题打卡第45天!

加油吧少年。

 

 

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/121842876

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。