如何使用头/尾实现克隆链表?

时间:2016-12-24 21:27:54

标签: c linked-list

我有一个带有以下结构实现的链表:

struct _node {
    int item;
    struct _node *next;
}

struct _list {
    struct _node *head;
    struct _node *tail;
    int size;
}

我想编写一个克隆链表并返回新列表而不修改原始列表的函数。我知道如何使用_node实现,但我不知道如何使用_list实现。

struct _node *cloneList (struct _node *head) {
    if (head == NULL) return NULL;

    struct _node *result = malloc(sizeof(struct _node));
    result->item = head->item;
    result->next = cloneList(head->next);
    return result;
}

这就是我所做的:

struct _list *cloneList (struct _list *list) {
    if (list == NULL) return NULL;

    struct _list *result = malloc(sizeof(struct _list));
    result->size = list->size;
    result->head = list->head;
    result->tail = list->tail;
    return result;
}

但这是一个错误的实现,因为它实际上并没有克隆列表,因为指向head和tail的指针仍然是相同的。

1 个答案:

答案 0 :(得分:2)

您必须将执行list元素实际克隆的旧函数与仅克隆" management"的新函数组合在一起。列表的一部分。

要做到这一点,可以稍微修改以前的版本:

struct _node *cloneList (struct _list *list, struct _node *head) {
  if (head == NULL) return NULL;

  struct _node *result = malloc(sizeof(struct _node));
  result->item = head->item;
  if (head->next)
    result->next = cloneList(list, head->next);
  else
    list->tail = result;
  return result;
}

然后从新功能

中调用它
struct _list *cloneFullList (struct _list *list) {
    if (list == NULL) return NULL;

    struct _list *result = malloc(sizeof(struct _list));
    result->size = list->size;
    if (list->head != NULL) {
      result->head = cloneList(result, list->head);
      // tail will be set in cloneList as well.
    }
    else {
      result->head = result->tail = NULL;
    }
    return result;
}