【问题标题】:How to count the number of nodes in a linked list without traversing it?如何在不遍历的情况下计算链表中的节点数?
【发布时间】:2011-06-16 08:01:12
【问题描述】:

我在面试中被问到如何在不遍历链表的情况下统计链表中的节点数?有什么方法可以实现吗?

【问题讨论】:

  • 插入时如何处理?
  • 是的@Jgar,答案很明显,这也是我向面试官提出的建议,但他没有留下深刻印象。
  • 理论上(虽然实际上不是很相关)假设您在程序中除了此链接列表之外没有执行任何分配,您可以查询操作系统现在和列表为空时的内存消耗差异。除以每个元素的大小将给出列表大小。显然不如只跟踪插入。
  • @Davin 有多实用??
  • 你应该问面试官:“我口袋里有多少硬币?” :)

标签: c linked-list


【解决方案1】:

我能想到的唯一方法是添加一个节点数计数器,该计数器在每次调用 addinsert 方法时递增,并在每次调用时递减delete 被调用。你不能对内存占用做出假设,因为作为一个链表,你不能保证所有节点都在同一个内存块中(事实上,这是极不可能的)。

【讨论】:

  • 我想知道堆中分配不会传染的一件事??
  • 你的意思是连续的吗? (对不起,但当我第一次阅读您的评论时,我感到非常困惑。)关于堆,您甚至没有作为保证。一般来说,是的,如果连续请求它们,大多数堆实现都会给你连续的块。但是,由于重新分配、碎片、不连续请求内存的节点等,您不能假设它们在内存中是连续的。
  • 对不起我的错误,它是连续的,没有传染性,我明白你的意思。
【解决方案2】:

如果您使用诸如 malloc 之类的东西进行动态分配,那么除了每次插入/删除时更新计数器之外别无他法。如果您没有进行动态分配,那么您可能还没有实现链表。

【讨论】:

    【解决方案3】:

    其他人所说的完全正确。你怎么能在看之前知道有多少物品?

    您将需要维护一个计数,并在插入/删除时增加/减少它。这是(最|唯一)可靠的方法。

    【讨论】:

      【解决方案4】:

      在你的结构中添加一个计数器并使链表循环而不是单独。无需遍历整个列表,只需遍历初始节点的上一个节点即可。

      【讨论】:

      • 如何在列表中间插入(或删除)一个节点,只引用新项目所链接的节点?
      猜你喜欢
      • 2011-06-10
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多