题目描述:876.链表的中间结点

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例:
输入:[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.

我个人现在对链表的操作不是很熟悉,所以这道题是看官方题解的。

方法一:数组

链表的缺点在于不能通过下标访问对应的元素。因此我们可以考虑对链表进行遍历,同时将遍历到的元素依次放入数组 A 中。如果我们遍历到了 N 个元素,那么链表以及数组的长度也为 N,对应的中间节点即为 A[N/2]。

class Solution:def middleNode(self, head: ListNode) -> ListNode:A = [head]while A[-1].next:A.append(A[-1].next)return A[len(A)//2]

这里我还是不能理解这样的做法。

方法2:单指针法
我们可以对方法一进行空间优化,省去数组 A。

我们可以对链表进行两次遍历。第一次遍历时,我们统计链表中的元素个数 N;第二次遍历时,我们遍历到第 N/2 个元素(链表的首节点为第 0 个元素)时,将该元素返回即可

# Definition for singly-linked list.
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = next
class Solution:def middleNode(self, head: ListNode) -> ListNode:n,cur = 0,headwhile cur:n += 1cur = cur.nextk,cur = 0,headwhile k < n //2:k += 1cur = cur.nextreturn cur

这个方法我还是比较理解的,对这个链表遍历2次,第一次计算链表长度,第二次找到中间结点,找到了中间结点就遍历到对应结点就找到了。

方法3;快慢指针
我们可以继续优化方法二,用两个指针 slow 与 fast 一起遍历链表。slow 一次走一步,fast 一次走两步。那么当 fast 到达链表的末尾时,slow 必然位于中间。

用2个指针遍历同一个链表,一个指针遍历快一点,一个指针遍历慢一点。

class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = next
class Solution:def middleNode(self, head: ListNode) -> ListNode:slow = headfast = headwhile fast and fast.next:slow = slow.nextfast = fast.next.nextreturn slow

每次循环,慢指针走一步,快指针走两步,等快指针走到最后,慢指针就在中间结点。

力扣练题之876题:链表的中间结点相关推荐

  1. 《LeetCode力扣练习》第206题 反转链表 Java

    <LeetCode力扣练习>第206题 反转链表 Java 一.资源 题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 示例 1: 输入:head = [1,2, ...

  2. 《LeetCode力扣练习》第160题 相交链表 Java

    <LeetCode力扣练习>第160题 相交链表 Java 一.资源 题目: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点.如果两个链表不存 ...

  3. 《LeetCode力扣练习》第141题 环形链表 Java

    <LeetCode力扣练习>第141题 环形链表 Java 一.资源 题目: 给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针 ...

  4. 《LeetCode力扣练习》第19题 删除链表的倒数第 N 个结点 Java

    <LeetCode力扣练习>第19题 删除链表的倒数第 N 个结点 Java 一.资源 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 示例 1: 输入:hea ...

  5. 《LeetCode力扣练习》第21题 合并两个有序链表 Java

    <LeetCode力扣练习>第21题 合并两个有序链表 Java 一.资源 题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例 ...

  6. 力扣牛客每日刷题(Python解法持续更新)

    力扣牛客每日刷题(持续更新) 初试结束第15天, 之前简单的处理了部分毕设方面的任务, 对接下来的学习做了个简单的规划 决定每天开始刷几道力扣题提高一下算法的理解,不能让之前学的数据结构都忘记了 每道 ...

  7. 《LeetCode力扣练习》第96题 不同的二叉搜索树 Java

    <LeetCode力扣练习>第96题 不同的二叉搜索树 Java 一.资源 题目: 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回 ...

  8. 《LeetCode力扣练习》第75题 颜色分类 Java

    <LeetCode力扣练习>第75题 颜色分类 Java 一.资源 题目: 给定一个包含红色.白色和蓝色.共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按 ...

  9. 《LeetCode力扣练习》第64题 最小路径和 Java

    <LeetCode力扣练习>第64题 最小路径和 Java 一.资源 题目: 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为 ...

  10. 《LeetCode力扣练习》第62题 不同路径 Java

    <LeetCode力扣练习>第62题 不同路径 Java 一.资源 题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" ). ...

最新文章

  1. TensorFlow XLA优化与Memory
  2. js增加属性_前端js基础2
  3. 国家五部委联合发布“AI标准顶层设计”:2021年明确、2023年初步建成
  4. 死磕java并发cas_死磕 java并发包之AtomicInteger源码分析
  5. linux 查询 lib信息,怎么查看linux是否使用 libarchive
  6. 一步步编写操作系统 59 cpu的IO特权级1
  7. leetcode718 最长重复子数组
  8. linux /etc/shadow 文本结构
  9. Softmax和softmax loss的理解
  10. [*C*]将整数转化为十进制字符串的函数Convert integer to Decimal string
  11. java中treemap_Java TreeMap – Java中的TreeMap
  12. javascript函数防抖Debounce
  13. 服务器状态码502什么意思,Http状态码502问题复盘
  14. 三星入职测试GSAT(global samsung aptitude test)
  15. codeforces C. Team
  16. 无人值守称重系统解决方案,加快企业数字化发展
  17. 35.滚动 scroll
  18. w7查看计算机每天开关机时间,win7系统开机时间怎么看?查看win7开机时间的方法...
  19. NLP系列(10)_词向量之图解Word2vec
  20. js组件化、模块化开发

热门文章

  1. Ubuntu虚拟机中VCS安装和启动过程中遇到的问题总结
  2. matlab fm非相干解调,FM调制和相干解调,非相干解调讲解.doc
  3. iOS 获取WKWebView内容高度做H5原生连接
  4. a标签带参页面跳转并在跳转页面接收参数
  5. 图解两部委DSM数据安全管理认证
  6. 谷歌浏览器上传文件总是卡死
  7. NOIP2013 花匠解题报告
  8. Kafka术语:AR、OSR、ISR、HW和LEO以及之间的关系
  9. NOTA-PEG-Lys/CS/HRP/MMPs大环配体-聚乙二醇-溶菌酶/硫酸软骨素/辣根过氧化氢酶/基质金属蛋白酶
  10. Fiddler抓包Android手机https、http教程