我今天接受了开发人员的采访,并被问到一个有趣的技术问题,我不知道答案。我会在这里问一下,看看是否有人可以为我的好奇心提供解决方案。这是一个多部分的问题:
1)您将获得一个包含100个元素的单链表(整数和指向下一个节点的指针),找到一种方法来检测链表中途是否有中断或损坏?您可以对链接列表执行任何操作。请注意,您必须在列表中执行此操作,因为它是迭代的,这是验证,然后您才意识到列表存在任何问题。
假设链表中的中断位于第50个元素,整数或甚至指向下一个节点(第51个元素)的指针可能指向垃圾值,该垃圾值不一定是无效地址。
2)请注意,如果链表中存在损坏,您将如何最大限度地减少数据丢失?
答案 0 :(得分:6)
要测试“损坏的”整数,您需要知道有效值的范围是什么。否则,无法确定任何给定(带符号)整数中的值是无效的。因此,假设您对int进行了有效性测试,您将始终在迭代到下一个元素之前检查该值。
测试损坏的指针比较棘手 - 首先,您需要做的是在尝试取消引用之前检查指向下一个元素的指针的值,并确保它是有效的堆地址。这将避免分段错误。接下来要验证指针指向的是实际上有效的链表节点元素 - 这有点棘手吗?也许将指针取消引用到列表元素类/结构中,并测试int和“next”指针的有效性,如果它们也很好,那么可以非常确定前一个节点也是好的。
On 2),发现了一个损坏的节点,[如果下一个指针被破坏]你应该做的是立即将前一个节点的“下一个指针”设置为'NULL',将其标记为列表的末尾,并记录您的错误等等,如果损坏只是整数值,而不是“下一个”元素指针,那么你应该从列表中删除该元素,并将前一个和后一个节点链接在一起 - 因为不需要在这种情况下扔掉列表的其余部分!
答案 1 :(得分:2)
如果您在设计时知道损坏可能会成为一个关键问题,您可以将“魔术值”作为字段添加到节点数据结构中,以便您可以识别某些数据是否可能是某个节点。甚至可以通过内存搜索节点。
或者加倍一些链接信息,即在每个节点中的下一个节点之后存储节点的地址,以便在一个链接断开时可以恢复。
我看到的唯一问题是你必须避免分段错误。
答案 2 :(得分:2)
第一部分 - 重载新操作符。当分配新节点时,在节点之前和之后分配一些额外的空间并在那里放置一些已知值。在遍历中,可以检查每个节点是否在已知值之间。
答案 3 :(得分:2)
如果您可以对链表执行任何操作,您可以做的是计算每个元素的校验和并将其存储在元素本身上。这样,即使元素上出现单个位错误,您也可以检测到损坏。
为了最大限度地减少数据丢失,您可以考虑将nextPtr存储在前一个元素中,这样如果当前元素已损坏,您始终可以找到上一个元素的位置。
答案 4 :(得分:0)
这是一个简单的问题,有几个可能的答案。每个都以效率换取稳健性。由于增加的鲁棒性是问题的先决条件,因此存在可用的解决方案,其牺牲时间(列表遍历速度,以及插入的速度和节点的删除速度)或者替代空间(每个节点存储的额外信息)。现在问题已经说明这是一个长度为100的固定列表,在这种情况下,链表的数据结构是最不合适的。为什么不让拼图更具挑战性,并说列表的大小不是先验的?
答案 5 :(得分:-3)
由于元素(100)的数量是已知的,因此第100个节点必须包含空指针。如果是这样,具有一些良好概率的列表是有效的(例如,如果第99个节点损坏并且指向具有全零的某个存储器位置,则无法保证这一点)。否则,存在一些问题(这可以作为事实返回)。
upd :此外,如果给定指针,可以在每一步中查看一些结构delete
,但由于使用delete
本身是在任何意义上都不安全,这将是特定于实现的。