【链表OJ 3】链表的中间结点

简介: 【链表OJ 3】链表的中间结点

一.链表的中间结点


来源:876. 链表的中间结点 - 力扣(LeetCode)

题目:

14f2aa1fe3a442979b2277d970c8ae4f.png


1.1原理:快慢指针的使用

这个算法之所以有效,是因为fast指针的移动速度是slow指针的两倍。

快慢指针的精妙之处在于,当快指针移动到链表尾部时,慢指针就刚好移动了链表长度的一半,从而找到中间节点。因此当,fast指针到达链表尾部时,slow指针将正好指向链表的中间节点。无论链表长度奇偶,这个方法都可以在一次遍历正确找到中间节点。

时间复杂度:O(n),因为只遍历链表一次。
空间复杂度:O(1),因为没有使用额外的空间。


整体思路:

  1. 函数以指向链表头部的指针作为参数。
  2. 初始化两个指针 slow fast,它们都指向链表的头部。
  3. 进入一个循环,只要fast不为NULL且fast->next不为NULL,循环会继续执行。这个循环用于通过链表前进指针。
  4. 每次循环迭代中,slow指针向前移动一步,通过赋值slow= slow-> next
  5. fast指针向前移动两步,通过赋值fast = fast -> next -> next
  6. 当循环结束时,slow指针将指向链表的中间节点。这是因为fast指针的移动速度是slow指针的两倍,当fast指针到达链表尾部时,slow指针刚好在链表的中间。
  7. 最后,函数返回slow指针,即链表的中间节点。


链表元素个数为奇数

动图演示:

9946acbccde743fbb5fb28c6ac09560b.gif


链表元素个数为偶数

返回第二个中间结点的原因是题目要求:

1ddc1d0d3bc447f190beaea8c67629cb.png

动图演示:

85b616abf373455984df1a39c3368496.gif


1.2循环条件问题?

循环条件不能调换顺序:

while 循环条件 fast && fast->next 不能写成 fast->next && fast 的目的是为了确保在遍历链表时不会出现空指针异常

如果将循环条件调换为fast->next&& fast ,在链表长度为奇数时,当快指针 fast指向最后一个节点时,fast->next仍然不为NULL,但此时fast已经为NULL,这样会导致在访问fastnext指针时出现错误。

通过保持条件为fast && fast->next ,可以确保在fast 和 fast->next 每次迭代中,快指针都不为NULL,从而避免了空指针的访问错误。这是正确处理快慢指针遍历的关键。

因此,为了保证代码的正确性,应该保持原始代码中的循环条件不变,即fast && fast->next

代码实现

struct ListNode* middleNode(struct ListNode* head){
      struct ListNode* slow=head,*fast=head;
      while(fast && fast->next)
      {
            slow=slow->next;
            fast=fast->next->next;
       }
       return slow;
}


代码执行:

ba48f708be004dfab66b4885da4b1e78.png

   本文到此结束,如有错误欢迎大家指正,感谢来访!

相关文章
|
2月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
69 1
|
1月前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
15 1
|
3月前
链表的中间结点
链表的中间结点
180 57
|
2月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
26 7
|
2月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
17 0
|
5月前
【数据结构OJ题】环形链表
力扣题目——环形链表
39 3
【数据结构OJ题】环形链表
|
4月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
5月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
54 1
【数据结构OJ题】复制带随机指针的链表
|
5月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
34 1
【数据结构OJ题】环形链表II
|
5月前
【数据结构OJ题】相交链表
力扣题目——相交链表
37 1
【数据结构OJ题】相交链表