微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

最好的处理方式,遍历链表时在链表中删除

如何解决最好的处理方式,遍历链表时在链表中删除

假设我有一个单链表,我正在遍历它并调用某个函数 f() 在某些条件下删除某个元素。该函数可以删除同一列表中的多个元素,这会使我们正在遍历的指针无效....

处理这种情况的最佳方法是什么..

解决方法

确实,当您删除单链表中的节点时,一旦释放相应的内存,您对已删除节点的引用(指针)就会失效。

附带说明:在某些编程语言中,这从来都不是问题,因为它们会为您进行内存管理,因此无法引用已释放的内存(例如 Java)。在这些环境中,内存会在(或一段时间后)没有更多引用时被释放。

在列表遍历期间处理此问题的一般方法是保留对列表中下一个节点的引用。为了删除当前节点,您还需要重新连接在前一个节点中引用它的指针。因此,您需要三个引用:上一个、当前和下一个。

伪代码:

prevptr := NIL
currentptr := headptr
while currentptr != NIL:
    nextptr := currentptr->next
    if decision_to_delete(currentptr):
        if prevptr != NIL:
            prevptr->next := nextptr
        else:
            headptr := nextptr
        dispose_memory(currentptr->)
    else:
        prevptr := currentptr
    currentptr := nextptr

如果你有一个函数 f() 可以删除几个连续节点,从你传递的当前节点开始,那么确保函数返回对它没有删除的第一个节点:

prevptr := NIL
currentptr := headptr
while currentptr != NIL:
    currentptr := f(currentptr)
    if prevptr != NIL:
        prevptr->next := currentptr 
    else:
        headptr := currentptr
    if currentptr == NIL:
        return
    prevptr := currentptr
    currentptr := currentptr->next

在这种情况下,f 负责决定是否删除节点(如果有)并处理它删除的节点所占用的内存。 f 的实现将使用 nextptr 工作方式,因此我们在调用代码中不再需要单独的引用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。