c++ - 如何在单次遍历中找到单链表的中间节点(如果不给出链表长度)

标签 c++ linked-list

我有这样的问题陈述:“如何在一次遍历中找到单向链表的中间节点,问题是我们不知道链表中的节点数?”

我有一个答案,比如“获取一个 vector ,并在遍历链表时开始推送所有节点的地址,并递增一个计数器,直到到达链表的末尾”。所以最后我们可以获得列表中的节点数,如果偶数 (counter/2) 或奇数 (counter/2 + counter%2) 给出中间节点号,我们可以得到 vectore。 at(middlenodenumber) 指向中间节点"。

这很好......但是这是浪费内存来存储一个非常大的链表的所有地址!那么如何才能有更好的解决方案呢?

最佳答案

步骤如下:

  • 取两个指针*p1*p2指向链表的头部 列表
  • 开始一个循环并递增 *p2,2 次(带空检查)
  • 如果 *p2 不为空则将 *p1 递增 1 次
  • *p2为null时;你在中心得到了 *p1

[注意:处理容器类型链表可以用迭代器代替指针]

关于c++ - 如何在单次遍历中找到单链表的中间节点(如果不给出链表长度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6703880/

相关文章:

c - 在链表的实现中在函数之间传递指针

c++ - 从双向链表中删除重复项

c - 通过 SunRPC 发送带缓冲区的链表 (c)

c++ - 为 sql loader 禁用 c++ 输出消息

c++ - 有没有办法区分 new 和 new[] 的返回值?

c++ - 在 C++ 中将 uint64_t 转换为 void 类型的目的是什么?

java - Java从单链表中删除第一个节点

asp.net - 将 ASP.NET 应用程序拆分为两个应用程序 - 处理共享页面/用户控件/脚本

c++ - 当 auto 遇到多态和虚函数时,正确的行为是什么?

c++ - 在面试中,应该期望 STL 专家回答什么问题