如果我发现链表中的指针(链接)字段已损坏,我该如何解决此问题?
我在采访中被问到这个问题。我说不,它不可能解决它。采访者告诉它可能。有什么方法吗?
答案 0 :(得分:5)
好吧,假设这是一个双重链接列表:
如果它是被破坏的“下一个”指针,可以从尾部开始并使用“前一个”指针,朝向头部遍历列表,同时保持对遍历的最后一个元素的引用。当您找到具有错误指针的元素时,您只需要使该元素的“下一个”指针指向遍历的最后一个元素。
如果双链表中的“上一个”链接已损坏,则该过程可以反转 - 从头开始,遍历直到找到错误的“上一个”指针并使用对最后一个元素的引用来修复它遍历。
答案 1 :(得分:0)
在开发我的嵌入式作业时,我使用了前向链接的队列。我保持计数和头指针。队列有一个check()方法,它运行round [count]链接,如果结果指针与head不同,则调用关键错误处理程序。它并非万无一失,但它可以很好地捕获双推和其他常见的队列错误。
注意:在多线程应用程序中,必须锁定队列以安全地检查它。
答案 2 :(得分:0)
在双循环链表中,如果指针(前一个或下一个指针)中的任何一个被破坏,我们可以解析损坏的指针。
如果下一个指针不正确,我们可以反向遍历列表然后我们可以纠正它,否则如果前一个指针不正确,我们可以向前遍历列表来纠正它。
现在我们必须考虑如何识别列表中的损坏链接(指针)。我们使用分别为每个节点分配动态内存(malloc
或calloc
)。如果我们经常调用malloc
或calloc
,那么小的内存可能会影响系统的性能。我们可以在初始阶段分配大量的堆内存,然后我们可以为每个节点创建实现自己的内存分配函数。并且还仅将此用于创建列表节点,以识别列表中已损坏的链接。
这可以提高系统的性能,还可以通过检查为列表分配的初始内存限制来识别节点的链接是否已损坏。
一旦我们得到一个指向节点的指针,我们必须首先进行以下检查,然后才能访问该节点中的数据。
check_limit(node);
check_limit(node->next);
check_limit(node->previous);
我们还可以检查node->previous
是否等于current_node
。
此后也可能node->next
可能指向错误的地址但在初始内存限制内。在这种情况下,我们可以阅读node->next->previous
(这不会导致崩溃,即使next
指向错误的地址但在初始内存限制内)并检查它是否等于node
或不
此外,未使用的初始内存空间应始终NULL
设置(使用memset
)。
通过这些方式,我们可以找到列表中99%的已损坏指针。
答案 3 :(得分:0)
在双向循环链表中,如果损坏的指针指向节点的存储位置之一,则首先使用遍历和标记方法找到循环。这将给出具有损坏指针的节点的位置,然后以相反的顺序进行遍历,然后找出具有上一个节点位置的节点作为第一步生成的节点。在该节点旁边分配损坏的节点的指针。问题已解决 反之亦然,逆时针方向反转。 上述解决方案需要o(N)个空间来匹配遍历的节点地址。
答案 4 :(得分:-1)
也许你应该摆脱它? 实际上,在一般情况下,当我们不能仅通过其他人插入列表的任何元素时,它是不可能的。