将链表复制到另一个链表 - 迭代 - C - 理解返回的列表
Copying a linked list onto another linked list - iteratively - C - understanding the returned list
尝试解决链表问题,今天我正在尝试 "given a linked list, copy it to another linked list"
为了反复执行此操作,
逻辑是
- 使用三个指针 - current、newList、newTail。
current
跟踪给定原始列表中的当前节点。
newList
以跟踪我要复制到的列表的 head。
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
,所以我不应该 return Tail
而不是 newList
吗?
当您添加列表中的第一个元素时 newList
和 tail
指向相同的地址 (tail = newList
)。
每次添加另一个元素时,您都将其添加到 tail
之后,然后将其移动到下一个位置 (tail = tail->next
)。也就是说,当您添加第二个元素时,tail
是 newList
现在将是 newList->next
.
这样,您可以 return newList
并让所有指针指向列表中的下一个元素。
尝试解决链表问题,今天我正在尝试 "given a linked list, copy it to another linked list"
为了反复执行此操作,
逻辑是 - 使用三个指针 - current、newList、newTail。
current
跟踪给定原始列表中的当前节点。
newList
以跟踪我要复制到的列表的 head。
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
,所以我不应该 return Tail
而不是 newList
吗?
当您添加列表中的第一个元素时 newList
和 tail
指向相同的地址 (tail = newList
)。
每次添加另一个元素时,您都将其添加到 tail
之后,然后将其移动到下一个位置 (tail = tail->next
)。也就是说,当您添加第二个元素时,tail
是 newList
现在将是 newList->next
.
这样,您可以 return newList
并让所有指针指向列表中的下一个元素。