void add_node(int n) {
node *tmp = new node;
tmp->data = n;
tmp->next = NULL;
if(head == NULL) {
head = tmp;
tail = tmp;
}
else {
tail->next = tmp;
tail = tail->next;
}
}
在else语句中,为什么我不能直接指定tail=tmp;而不是tail=tail->next;我缺什么了吗?提前感谢!
让我们取一个简单的小列表:
+--------++-------++-------+|node1|-->|node2|-->|node3|+-------++--------++-------+^^||head-tail
现在要在列表末尾添加一个新节点,我们首先将新节点添加到列表中,方法是使tailsnext
指针指向新节点:
+--------++-------++-------++-------+|node1|-->|node2|-->|node3|-->|节点4|+-------++--------++-------++-------+^^||head-tail
这就是赋值tail->next = tmp
的作用。
然后我们更新tail
以指向新的尾部:
+--------++-------++-------++-------+|node1|-->|node2|-->|node3|-->|节点4|+-------++--------++-------++-------+^^||head-tail
这就是赋值tail = tail->next
的作用。当然,这也可以通过执行tail = tmp
来实现。
这两项作业的顺序很重要。
现在,如果你用相反的方法,当我们有时,先分配tail = tail->next
+--------++-------++-------+|node1|-->|node2|-->|node3|+-------++--------++-------+^|head
你再也没有尾巴了!除非在整个列表上循环以找到next
指针为空指针的节点,否则您不知道列表的结束位置以及新节点的插入位置。
您可以这样做,但不会产生正确的结果。如果您无法从代码中找出原因,请使用调试器进行跟踪。