【问题标题】:what does x.next.prev mean in linked lists (data structures)?x.next.prev 在链表(数据结构)中是什么意思?
【发布时间】:2018-08-15 03:13:36
【问题描述】:

我知道 x.next 是 x 的下一个元素,而 x.prev 是 x 的前一个元素。但是 x.next.prev 或 x.prev.next 是什么意思呢?

我希望这里有知识渊博的人拥有知识的堆栈溢出:-))。 谢谢。

【问题讨论】:

  • 它指向x 本身。
  • 另外:谷歌搜索“跳舞链接”

标签: data-structures linked-list


【解决方案1】:

“x.next”指的是链表中的下一个节点。这个节点(就像列表中的所有节点一样)有一个“下一个”和一个“上一个”指针。该节点的“previous”指针指向原始节点。

所以x.next.previous指的是当前节点,只要“x.next”不为空即可。

同样,x.prev.next 指的是当前节点,只要“x.prev”不为空即可。

【讨论】:

  • 我还是不明白。如果它指的是当前节点,为什么需要来回走动?上一个和下一个,还是下一个和上一个?
  • @Jimmy 你不需要来回走动。真正的问题是你为什么要问这个问题?你在某处的代码中看到过这个吗?我能看到的唯一可能的用途是验证链表。如果x.next.prev != x,那你就有问题了。
  • 亲爱的@JimMischel,首先,我很高兴你正在写作。谢谢你。老实说,我刚开始做这件事,突然之间就出现了 x.next.prev 或者反之亦然。我问这个问题不是为了找到解决方案,我只是想了解它的含义。希望你能理解我。
  • @Jimmy 就像在任何自然语言中一样,编程语言允许你说多余或无意义的事情。
【解决方案2】:

这些形式是有意义的,例如在添加和删除doubly linked lists的节点,以节省一些措辞。

假设你有一个这样的双向链表:

假设您正在编写从中删除节点 B 的代码。为此,您首先使 C 的“后退”指针指向 A 而不是 B。它将是

C.prev = A

要实现这一点:

如果您的代码中只有一个 B 句柄,您将首先找到那些 A 和 C,然后执行相同操作:

C = B.next
A = B.prev
C.prev = A

或者,没有临时变量:

B.next.prev = B.prev

这本质上是您的 x.next.prev。稍后将 A 的前向指针更改为从 B 指向 C 时,您将编写 B.prev.next = B.next,其中包含您的第二种形式 x.prev.next

对于双向链表,这不仅可以用于删除,还可以用于添加新节点。查看here 的更多伪代码。

还要注意,在上图中的情况下,“不变”B.next.prev == B 不成立。您可能会遇到必须处理这种违反条件的代码,例如,在无锁算法中。在那里,当您阅读x.next.prev 时,您不确定它是否与x 相同,并且必须处理不同的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 2020-07-17
    • 1970-01-01
    • 2011-06-25
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多