在此代码中:
Node *CopyList(Node **head) {
Node *current = *head;
Node *NewNode = NULL;
Node *tail = NULL;
while (current != NULL ) {
if (NewNode == NULL) {
NewNode = malloc(sizeof(Node));
NewNode->data = current->data;
NewNode->next = NULL; // routine
tail = NewNode;
} else {
tail->next = malloc(sizeof(Node)); // here
tail = tail->next;
tail->data = current->data;
tail->next = NULL;
}
current = current->next;
}
return(NewNode);
}
为什么我们将tail->next
分配给malloc()
来电的结果?显然,如果我们不这样做,就会发生分段错误。
为什么我们不分配tail
而不是tail->next
?在这种情况下,我应该像这样分配下一个?
答案 0 :(得分:2)
避免额外的变量只是一种方便:
Node* temp = malloc(sizeof(Node)); // here
temp->data = current->data ;
temp->next = NULL ;
tail->next = temp ;
tail = tail->next;
我们为什么不分配尾部而不是尾部>接下来?
尾部已经分配,它充当前一个节点,因此我们可以将它链接到下一个节点。我们使用tail-> next = that_node。
为该节点分配一个新节点和链接尾部答案 1 :(得分:1)
此处NewNode表示新链接列表头。因此,在while循环中第一次分配它,以便下次不会改变它。来到你的问题' tail-> next'而不是'尾巴'因为第一次' NewNode == NULL'那么' tail = NewNode'获取执行意味着尾部具有NewNode地址。接下来你需要将下一个块复制到' tail-> next'因为尾巴已经有了NewNode'。