循环双链表Java - 解释

问题描述 投票:0回答:2

目前,我正在编写一个循环的双向链表,我的任务已完成,但我在理解代码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方法,则第一个节点指向最后一个节点,因此圆圈关闭。但第三行究竟描述了什么?代码绝对有效。

感谢您的时间!

迎接多米尼克

java doubly-linked-list
2个回答
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
投票

代码在newNode之前插入startpoint。 else语句的第3行只是更新起始点之前的节点,以便它的next字段引用新节点。

为了更清楚,可以像这样重写这一行:

    Node nodeBeforeStarpoint = startpoint.prev;
    nodeBeforeStartpoint.next = newNode; 
© www.soinside.com 2019 - 2024. All rights reserved.