尝试解决链表问题,今天我尝试"给定一个链表,将其复制到另一个链表"
要迭代地执行此操作,
逻辑应该是-使用三个指针——current, newList, newTail。
current
在给定的原始列表中跟踪当前节点。
newList
来跟踪我复制到的列表的头。
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
而不是newList
吗?
当你在列表中添加第一个元素newList
和tail
指向相同的地址(tail = newList
)。
每次添加另一个元素时,将其添加到tail
之后,然后将其移动到下一个位置(tail = tail->next
)。也就是说,当你添加第二个元素时,tail
从newList
变成了newList->next
。
这样,您可以返回newList
,并使所有指针都指向列表中的下一个元素。