目前,我正在编写一个循环的双向链表,我的任务已完成,但我在理解代码100%时遇到了一些问题。
这是代码:
if (counter == 0) {
startpoint = newNode;
startpoint.next = startpoint;
startpoint.prev = startpoint;
head = startpoint;
currentNode = newNode;
} else {
newNode.prev = startpoint.prev;
newNode.next = startpoint;
startpoint.prev.next = newNode; <- this is, where I have problems
startpoint.prev = newNode;
head = startpoint;
currentNode = newNode;
}
counter++;
}
第一部分是完全清晰的,只是描述了当调用next或first-method时,第一个节点(如果没有其他节点)将指向自身。在else语句之后,第一行描述第一个节点可以指向第二个节点,第二个节点指向前一个节点,对吗?其他第二行刚刚描述,最后一个节点指向第一个节点。第四行描述,如果调用prev方法,则第一个节点指向最后一个节点,因此圆圈关闭。但第三行究竟描述了什么?代码绝对有效。
感谢您的时间!
迎接多米尼克
你的清单是循环的。
startpoint.prev
是起始点之前的元素,因此它是列表的最后一个元素。
让我们举一个例子,这是你的列表:A>B>C
,你试着添加D
。
这一行:startpoint.prev.next = newNode;
将当前的最后一个元素(C
作为A.prev == C
)链接到你的新元素。 (C.next = D
)
这行startpoint.prev = newNode;
将新元素设置为列表的最后一个元素(A.prev = D
)。
代码在newNode
之前插入startpoint
。 else语句的第3行只是更新起始点之前的节点,以便它的next
字段引用新节点。
为了更清楚,可以像这样重写这一行:
Node nodeBeforeStarpoint = startpoint.prev;
nodeBeforeStartpoint.next = newNode;