我有一个带有以下结构实现的链表:
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的指针仍然是相同的。
答案 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;
}