我在理解这段代码时遇到了一些麻烦。它工作正常,但我不理解它的某些部分。
禁止给定代码将文件添加到列表中。 但是我感到困惑的部分是
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;
}
答案 0 :(得分:1)
我目前感到困惑的是fNext-&gt; fPrevious和fNext之间的差异。两者都指向同一件事。
不,他们不是。是的,我们将fNext->fPrevious
设置为&aNode
。但在我们将fNext
设置为&aNode
后,fNext
不是我们设置fPrevious
的节点,而是aNode
。因此fNext->fPrevious
为aNode.fPrevious
,this
,而不是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 --> ...
-------------------/
请注意,此时,this
和aNode
都认为next
节点是他们的fNext
。
最后,我们通过将fNext
设置为&aNode
来解决这个问题:
prev this aNode next
... <-- fPrevious <-- fPrevious <-- fPrevious
fNext --> fNext --> fNext --> ...
现在aNode
已正确插入到this
和next
之间的链接列表中,并且所有人都同意所有内容。