我对以下段代码感到有点困惑,假设我们已经有一个双链表头 - >尾部;
class DLinkedNode {
int key;
int value;
DLinkedNode pre;
DLinkedNode post;
}
/**
* Always add the new node right after head;
*/
private void addNode(DLinkedNode node){
node.pre = head; // line 1
node.post = head.post; // line 2
head.post.pre = node; // line 3
head.post = node; // line 4
}
我尝试跟踪代码
第1行:head->节点; head-> tail(原始列表)
第2行:head-> node-> tail; head-> tail(原始列表)
第3行:????
第4行:????
我无法理解第3行和第4行,在执行第1行和第2行之后,有两个双链表(一个是原始双链表,另一个是新创建的一个)?哪个头是第3行是指?
答案 0 :(得分:4)
假设头部和尾部最初是双向链表中的两个节点,以下是ascii art中发生的事情!
致电之前:
+--------+
| post|
| node |
|pre |
+--------+
+-------------------------------------------+
| |
| |
| +--------+ +--------+ |
+-> | post+---------------> | post+---+
| head | | tail |
+---+pre | <---------------+pre | <-+
| +--------+ +--------+ |
| |
+-------------------------------------------+
第1行:
+--------+
| post|
| node |
+----------+pre |
| +--------+
|
+------|------------------------------------+
| | |
| v |
| +--+-----+ +--------+ |
+-> | post+---------------> | post+---+
| head | | tail |
+---+pre | <---------------+pre | <-+
| +--------+ +--------+ |
| |
+-------------------------------------------+
第2行:
+--------+
| post+---------+
| node | |
+----------+pre | |
| +--------+ |
| |
+------|-----------------------------|------+
| | | |
| v v |
| +--+-----+ +-----+--+ |
+-> | post+---------------> | post+---+
| head | | tail |
+---+pre | <---------------+pre | <-+
| +--------+ +--------+ |
| |
+-------------------------------------------+
第3行:
+--------+
| post+---------+
| node | |
+----------+pre | |
| +------+-+ |
| ^ |
+------|-----------------|-----------|------+
| | | | |
| v | v |
| +--+-----+ | +-----+--+ |
+-> | post+---------------> | post+---+
| head | | | tail |
+---+pre | +-----+pre | <-+
| +--------+ +--------+ |
| |
+-------------------------------------------+
第4行:
+--------+
| post+---------+
| node | |
+----------+pre | |
| +-+----+-+ |
| ^ ^ |
+------|------------|----|-----------|------+
| | | | | |
| v | | v |
| +--+-----+ | | +-----+--+ |
+-> | post+------+ | | post+---+
| head | | | tail |
+---+pre | +-----+pre | <-+
| +--------+ +--------+ |
| |
+-------------------------------------------+
最终结果:
+----------------------------------------------------+
| |
| |
| +--------+ +--------+ +--------+ |
+-> | post+--------> post+--------> post+---+
| head | | node | | tail |
+---+pre <--------+pre <--------+pre | <-+
| +--------+ +--------+ +--------+ |
| |
+----------------------------------------------------+
答案 1 :(得分:2)
第3行说明列表中的第一项应该具有新上一项的先前值。
第4行说你的旧最后一项实际上应该有一个指向新头的下一个值。
答案 2 :(得分:1)
第3行修改旧的第二个节点(现在是第3个节点)。它将新的第二个节点设置为其上一个节点。
第4行修改头部以将新节点设置为第二个节点。
答案 3 :(得分:1)
双向链表的初始状态;
head -----------------> head.post
在这种情况下,请考虑 head.post 是一个任意节点,新节点将在 head 之后,之前定位(插入) > head.post 强>
head
,head.post
和node
的引用状态会逐渐改变,如下所示;
node.pre = head;
head <----------------> head.post
head <----------------- node
node.post = head.post;
head <----------------> head.post
head <----- node -----> head.post
head.post.pre = node;
head <----- node <----> head.post
head.post = node;
head <----> node <----> head.post
希望它有所帮助。