链表指针赋值为什么我们不能直接将尾巴分配给 temp 而不是尾巴>尾巴下一个


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指针为空指针的节点,否则您不知道列表的结束位置以及新节点的插入位置。

您可以这样做,但不会产生正确的结果。如果您无法从代码中找出原因,请使用调试器进行跟踪。

最新更新