[英]Circular Doubly Linked List Java - Explanation
目前,我正在编写一个循环双链表,并且我的任务已完成,但是在理解代码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++;
}
第一部分是完全清楚的,仅描述了当调用下一个或第一个方法时,第一个节点(如果没有其他节点)将指向自己。 在else语句之后,第一行描述第一个节点可以指向第二个节点,第二个节点可以指向前一个节点,对吗? 后面的第二行仅描述了最后一个节点指向第一个节点。 第四行描述的是,如果调用了prev方法,则第一个节点指向最后一个节点,因此圆是闭合的。 但是第三行到底描述了什么? 该代码绝对有效。
感谢您的时间!
向多米尼克致意
您的清单是循环的。
startpoint.prev
是startpoint.prev
之前的元素,因此它是列表的最后一个元素。
让我们举个例子,这是您的列表: A>B>C
,您尝试添加D
这行代码: startpoint.prev.next = newNode;
会将当前的最后一个元素( C
为A.prev == C
)链接到新元素。 ( C.next = D
)
这行startpoint.prev = newNode;
将新元素设置为列表的最后一个元素( A.prev = D
)。
该代码在startpoint
之前插入newNode
。 else语句的第三行仅更新起点之前的节点,以便其next
字段引用新节点。
为了更加清楚,可以像这样重写该行:
Node nodeBeforeStarpoint = startpoint.prev;
nodeBeforeStartpoint.next = newNode;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.