目前,我正在编写一个循环的双向链表,我的任务已经完成,但我在理解代码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方法,则第一个节点指向最后一个节点,因此圆圈关闭。但第三行究竟描述了什么?代码肯定有用。
感谢您的时间!
电贺 多米尼克
答案 0 :(得分:1)
您的清单是通告。
startpoint.prev
是起始点之前的元素,因此它是列表的最后一个元素。
我们举个例子,这是您的列表:A>B>C
,您尝试添加D
。
这一行:startpoint.prev.next = newNode;
会将当前的最后一个元素(C
作为A.prev == C
)链接到您的新元素。 (C.next = D
)
此行startpoint.prev = newNode;
会将新元素设置为列表的最后一个元素(A.prev = D
)。
答案 1 :(得分:1)
代码在newNode
之前插入startpoint
。 else语句的第3行只是在起始点之前更新节点,以便它的next
字段引用新节点。
为了更清楚,可以像这样重写一行:
Node nodeBeforeStarpoint = startpoint.prev;
nodeBeforeStartpoint.next = newNode;