双链表困惑

时间:2018-05-12 05:55:16

标签: c++ algorithm doubly-linked-list

我在理解这段代码时遇到了一些麻烦。它工作正常,但我不理解它的某些部分。

禁止给定代码将文件添加到列表中。 但是我感到困惑的部分是

fNext-> fPrevious =& aNode

fNext =& aNode

第一部分是将值赋给fNext-> fPrevious

然而,

不是fNext到& Node

的第二部分写入值

在这种情况下,fNext-> fPrevious和fNext中的值不应相同。

有人可以向我解释一下。我已经看过这些例子,但我理解双链表的概念,但我不明白这段代码。

也可以有人详细说明这部分

aNode.fPrevious =这个。

 void DoublyLinkedNode<DataType>::append(Node& aNode)
{
    aNode.fPrevious = this;

    if (fNext != &NIL)
    {
        aNode.fNext = fNext;

        fNext->fPrevious = &aNode;

    }

    fNext = &aNode;   
}

DoubleLinkedNode的构造函数就像这样。

template<class DataType>
DoublyLinkedNode<DataType>::DoublyLinkedNode(const DataType& aValue)
{
    fValue = aValue;
    fPrevious = &NIL;
    fNext = &NIL;
}

1 个答案:

答案 0 :(得分:1)

  

我目前感到困惑的是fNext-&gt; fPrevious和fNext之间的差异。两者都指向同一件事。

不,他们不是。是的,我们将fNext->fPrevious设置为&aNode。但在我们将fNext设置为&aNode后,fNext不是我们设置fPrevious的节点,而是aNode。因此fNext->fPreviousaNode.fPreviousthis,而不是aNode

也许它会帮助给所有这些节点命名,并以图形方式查看它。在致电append之前,你有类似的事情:

prev      this          next                   aNode
...   <-- fPrevious <-- fPrevious      NIL <-- fPrevious
fNext --> fNext     --> ...                    fNext     --> NIL

首先,您将aNode.fPrevious设置为this,将aNode.fNext设置为fNext,因此它会指向this并转发next

prev      this          next                   aNode
...   <-- fPrevious <-- fPrevious     this <-- fPrevious
fNext --> fNext     --> ...                    fNext     --> next

然后将fNext->fPrevious设置为&aNode。由于fNext当前是next个节点,因此您将next的后指针更改为指向aNode

prev      this          aNode         next
...   <-- fPrevious <-- fPrevious <-- fPrevious
fNext --> fNext \       fNext     --> ...
                 -------------------/

请注意,此时,thisaNode都认为next节点是他们的fNext

最后,我们通过将fNext设置为&aNode来解决这个问题:

prev      this          aNode         next
...   <-- fPrevious <-- fPrevious <-- fPrevious
fNext --> fNext     --> fNext     --> ...

现在aNode已正确插入到thisnext之间的链接列表中,并且所有人都同意所有内容。