链接列表:使用递归复制列表

时间:2016-07-19 17:37:38

标签: recursion linked-list

我是Linked List的新手。我正在尝试编写一个可以将链表复制到新列表的CopyList()代码。这是一个使用递归的独特版本,我真的不明白:

struct node
{
    int data;
    struct node *next;
};

struct node* CopyList(struct node* head) {
   struct node* current = head;

   if (current == NULL) return NULL;
   else {
      struct node* newList = malloc(sizeof(struct node));
      newList->data = current->data;
      newList->next = CopyList(current->next); // recur for the rest
      return(newList);
   }
}

我理解的麻烦是行newList-> next = CopyList(current-> next); 那么这对复制有何影响?为什么呢?

3 个答案:

答案 0 :(得分:1)

让我们举个例子。如果你只是将current-> next放在newList->中 即

newList-> next = current-> next。然后它将仅指向旧列表的下一个节点。不到新列表的下一个节点。 所以要制作一个不同的列表(复制列表)。您必须单独创建一个新节点并将其返回以指向上一个节点的下一个节点。

答案 1 :(得分:0)

这是递归步骤。前两个命令创建一个新节点,并将当前列表的头部复制到该对象。现在,我们不再迭代(循环)列表的其余部分,而是调用 CopyList 来复制列表的余数 - 所有除了我们刚刚复制的头节点。

CopyList 会返回该剩余部分的副本,我们只需将其附加到头部节点的副本......我们就完成了。

答案 2 :(得分:0)

这是一个神奇的递归陈述。

newList-> next = CopyList(current-> next);

对于每个递归步骤,这将将创建剩余链表的任务委托给下一个递归调用。

例如:列表是从右到左创建的。

CopyList (1->2->3->4->5)
|
|---------1-> CopyList (2->3->4->5)
              |
              |---------2-> CopyList (3->4->5)
                            |
                            |---------3-> CopyList (4->5)
                                          |
                                          |---------4-> CopyList (5)
                                                        |
                                                        |---------5-> CopyList (NULL)

                                                                  Returns 5
                                                    Returns 4->5->NULL
                                      Returns 3->4->5->NULL
                         Returns 2->3->4->5->NULL
           Returns 1->2->3->4->5->NULL

根据维基

  1.   

    一个简单的基本案例(或案例) - 一个不使用递归来产生答案的终止场景。

  2.   

    一组规则,将所有其他案例减少到基本案例。

    在您的情况下,终止方案是如果列表到达结尾,只返回null并在将列表引导到基本方案的每一步创建新节点。