尝试链接列表问题,今天我正在尝试“给出一个链表,将其复制到另一个链表”
为了反复这样做,
逻辑是 - 使用三个指针 - current,newList,newTail。
memory_order_seq_cst
跟踪给定原始列表中的当前节点。
current
跟踪我要复制到的列表的 head 。
newList
跟踪我正在复制的列表的 tail 。
Tail
指向最后一个节点。为此,我的副本列表函数应该>>应该是这样的 -
tail
我的问题是:
如果我struct node* CopyList(struct node* head) {
struct node* current = head; // used to iterate over the original list
struct node* newList = NULL; // head of the new list
struct node* tail = NULL; // kept pointing to the last node in the new list
while (current != NULL) {
if (newList == NULL) { // special case for the first new node
newList = malloc(sizeof(struct node));
newList->data = current->data;
newList->next = NULL;
tail = newList;
}
else {
tail->next = malloc(sizeof(struct node));
tail = tail->next;
tail->data = current->data;
tail->next = NULL;
}
current = current->next;
}
return(newList);
}
,我将只有一个节点,不是吗?
因为如果新列表不为空,我前进return(newList)
,我不应该返回Tail
而不是Tail
吗?
答案 0 :(得分:3)
当您添加列表newList
中的第一个元素且tail
指向同一地址(tail = newList
)时。
每次添加其他元素时,请在tail
之后添加,然后将其移至下一个位置(tail = tail->next
)。也就是说,当您添加第二个元素时,tail
newList
现在将为newList->next
。
这样,您可以返回newList
并让所有指针指向列表中的下一个元素。