C 如何在不遍历链表的情况下计算链表中的节点数?

C 如何在不遍历链表的情况下计算链表中的节点数?,c,linked-list,C,Linked List,在一次采访中,我被问及如何在不遍历链表的情况下计算链表中的节点数?有什么方法可以实现这一点吗?我能想到的唯一方法是添加一个节点数计数器,该计数器在每次调用add或insert方法时递增,在调用delete时递减。您不能对内存占用做出假设,因为作为一个链表,您不能保证所有节点都在同一个内存块中(事实上,这是极不可能的)。如果您使用malloc之类的工具动态分配,那么除了每次插入/删除时更新计数器外,别无其他方法。如果您没有动态分配,那么您可能还没有实现链表。其他人所说的完全正确。在看东西之前,你怎

在一次采访中,我被问及如何在不遍历链表的情况下计算链表中的节点数?有什么方法可以实现这一点吗?

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

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

其他人所说的完全正确。在看东西之前,你怎么知道里面有多少东西


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

在结构中添加一个计数器,并使链表循环,而不是单个链表。与其遍历整个列表,不如遍历到初始节点的上一个节点。

插入时如何处理它?是的@Jgar这是非常明显的答案,这也是我向面试官建议的,但他没有留下深刻的印象。理论上(尽管实际上不是很相关)假设除了这个链表之外,您在程序中没有执行任何分配,那么您可以查询操作系统当前与列表为空时的内存消耗差异。除以每个元素的大小将得到列表大小。显然不如只跟踪insert好。@Davin这有多实际?你应该问面试官:“我口袋里有多少硬币?”:)有一件事我想知道,堆中的分配不会传染??你是说连续的吗?(很抱歉,但当我第一次看到你的评论时,我感到非常困惑。)关于堆,你甚至不能保证这一点。一般来说,是的,如果在secquence中需要连续块,大多数堆实现都会提供连续块。但是,由于重新分配、碎片化、不要求在secquence中使用内存的节点等原因,您不能假定它们在内存中是连续的。很抱歉,我的错误是连续的,它不会传染,我明白您的意思。如何插入(或删除)内存列表中的一个节点,只引用指向新项目的节点的链接?