是否有删除一半双向链表边缘的名称?

Posted

技术标签:

【中文标题】是否有删除一半双向链表边缘的名称?【英文标题】:Is there a name for removing half of a doubly linked list edge? 【发布时间】:2014-11-17 17:53:37 【问题描述】:

注意:这并不特定于 Java/C/C++,但链表与它们一样普遍,我选择在这些语言以及双向链表下标记它。如果错了,我可以改!

假设你有一个标准的双向链表实现:

struct List 
    int Number;
    struct List *blink;
    struct List *flink;
;

并且您有以下列表:

1 <--> 2 <--> 3 <--> 4 <--> 5

现在,就我而言,我一直在使用 flink 作为各种终结符,并在单个方向上取消链接节点:

1 <--> 2 <--> 3 <--| 4 <--> 5

所以 3 的 flinknull,但 4 的 blink 指向 3。

(有点不相关,我一直这样做是为了快速修改和恢复链表,并且有类似的东西:

1 <--> 2 <--| 3 <--> 4 <--> 5
         <--> 6 <--| 7 <--> 8
                <--> 9 <--> 10 <--> 11

建立1 2 6 9 10 11的列表

我的问题实际上只是“这种类型的操作有明确定义的名称吗?”我一直称它为“剪羊毛”,但如果有真名,那就太好了。

【问题讨论】:

可能类似于this? @StackFlowed 或者cs.stackexchange.com @Heron 哦,谢谢,我去那里问问 :) @StackFlowed 这个问题完全是off-topic 在超级用户。在建议人们在那里提问之前,请检查网站上的主题! @Heron 请明确建议人们标记迁移。新用户没有意识到它的存在,我们最终在 SE 网络上收到了多个问题副本,这违反了网站政策并浪费了人们的时间。 【参考方案1】:

双向链表是一种乱七八糟的东西。它基本上是以不正确的方式删除节点。

为什么我说它不合适是,考虑节点 2 和 6,2 的 flink 为空,而 6 的 blink 指向 2。

通过这个你告诉 2 是最后一个节点,而 2 在 6 的后面。这是矛盾的。

你在哪里需要这种方法?

【讨论】:

我正在尝试优化一些需要访问所有可能路径的图遍历代码。有相当数量的数据一旦生成对于它相关的节点来说将是恒定的,而不是每次我点击节点时都重新生成它,我想生成一次,然后根据需要重新链接我的链表,因为数据在任何节点上都对列表中位于其前面的数据敏感。这不是一个很好的解释,我真的找不到合适的词来解释它:/【参考方案2】:

好吧,除非您还保存指向节点 3、4、5、7 和 8 的指针,否则这将被称为“内存泄漏”。

即分配的内存您不再有访问和释放的方式。

【讨论】:

对不起,我想我没有说清楚。绝对存储取消链接的指针;) 虽然 rafeek 的回答有点半开玩笑,但他确实有一点:这种数据结构似乎很可能会导致代码中出现细微的错误。因此,它可能没有名字,因为它不会被广泛使用。

以上是关于是否有删除一半双向链表边缘的名称?的主要内容,如果未能解决你的问题,请参考以下文章

双向链表

Python 双向链表

Java实现双向链表的基本操作

在 Java 中清除受保护的双向链表

双向链表

❤️数据结构入门❤️(1 - 4)- 双向链表