将链表复制到另一个链表 - 迭代 - 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

为此,我的复制列表函数 应该 看起来像这样 -

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 吗?

当您添加列表中的第一个元素时 newListtail 指向相同的地址 (tail = newList)。

每次添加另一个元素时,您都将其添加到 tail 之后,然后将其移动到下一个位置 (tail = tail->next)。也就是说,当您添加第二个元素时,tailnewList 现在将是 newList->next.

这样,您可以 return newList 并让所有指针指向列表中的下一个元素。