登录
首页 >  Golang >  Go问答

删除双向链表的所有节点的方法

来源:stackoverflow

时间:2024-02-27 18:42:26 403浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《删除双向链表的所有节点的方法》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

我很好奇删除双向链表中所有节点的正确方法是什么。

这是我的链表结构:

type listnode struct {
    data branch
    next *listnode
    prev *listnode
}

type doublylinkedlist struct {
    head *listnode
    tail *listnode
    size int
}

如果我只是将 head & tail 节点指向 nil 会起作用吗?

func deleteAllNodes(dl *doublyLinkedList) {
    dl.Head = nil
    dl.Tail = nil
    dl.Size = 0
}

如果是这样,所有节点会发生什么?它会被垃圾收集吗?


正确答案


在引用计数环境中(Rust 中的 Arc,C++、Swift 中的 shared_ptr 等),这可能会泄漏。

节点之间可能有引用,但没有其他对它们的引用。用图论术语来说,被“删除”的节点形成对象图的一个组成部分,该对象图现在是一个断开连接的图。

任何具有跟踪垃圾收集器的环境(包括 Go)都可以处理这个问题,没有问题。

首先,GC将检测内存图的所有连接组件(那些从根引用引用的对象,如全局变量、局部变量等)。这称为“标记”阶段。然后,它将在第二个“扫描”阶段删除所有断开连接的组件。 https://en.wikipedia.org/wiki/Tracing_garbage_collection#Na%C3%AFve_mark-and-sweep

今天关于《删除双向链表的所有节点的方法》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>