【发布时间】:2020-07-20 15:09:49
【问题描述】:
这是节点类本身的代码:
struct Node {
int data;
struct Node * next;
Node(int x) {
data = x;
next = NULL;
}
};
下面的代码在链表的开头插入一个新节点。我的问题是为什么第四行没有弄乱列表的顺序。如果 head 之前位于 new_node 之后的位置,则不会将 head 设置为等于 new_node 弄乱列表。当我运行代码时,它按预期工作,但我不知道为什么。
Node *insertAtBegining(Node *head, int newData) {
Node* new_node = new Node(newData);
new_node -> next = head;
head = new_node;
return head;
}
我的第二个问题是关于以下代码,它应该在链表的末尾插入一个项目。我明白这个是如何工作的,我只是不明白为什么它的简化版本也不起作用。
Node *insertAtEnd(Node *head, int newData) {
Node* new_node = new Node(newData);
if(head == nullptr){
head = new_node;
return head;
}
else{
Node* trav = head;
while(trav -> next != nullptr){
trav = trav -> next;
}
trav -> next = new_node;
return head;
}
}
简化版
Node *insertAtEnd(Node *head, int newData) {
Node* new_node = new Node(newData);
Node* trav = head;
while(trav != nullptr){
trav = trav -> next;
}
trav = new_node;
}
简化版仅将您尝试添加的最后一个节点附加到列表末尾。因此,如果您尝试附加 1、2 和 3,则只会添加 3 个。由于 trav 指针刚刚成为最后一个 next 指针,它不应该做同样的事情吗?
【问题讨论】:
-
“简化”版本不返回任何内容。
-
head不是节点,它是一个保存节点地址的变量。head = new_node;不移动任何节点! -
还要注意
head = new_node并没有真的做任何事情。您可以删除该行,并将返回语句更改为return new_node,代码将执行相同的操作。 -
简化版的正文可以进一步简化为等效的
Node* trav = new Node(newData);。你能发现问题吗? -
trav 指针不会成为最后一个 next 指针。它变成了 nullptr。
标签: c++ linked-list