如何深度复制链表对象指针



>我正在尝试创建一个函数,该函数将创建一个新的链表,给定一个指向整数数组的指针。

这是我的代码,更多信息如下:

#include "iostream"

using namespace std;
//Definition for singly-linked list.
struct ListNode {
//members
int val;
ListNode *next;
//constructor
ListNode(int x) : val(x), next(NULL) {}
//overload assignment operator
void operator=(const ListNode &right_list ) { 
val = right_list.val;
next = right_list.next;
}   
};
//error here:
//creating new linked list
ListNode*  createNewList(int* x, int length) {
if (*x == NULL) return NULL;
ListNode newList = ListNode(-1);
ListNode* ptr = &newList;
int count = 0;
while (count < length) {
ptr->val = *(x + counter);
ListNode newElement = ListNode(-1);
ptr->next = &newElement;
ptr = ptr->next;
counter++;
}
ListNode* returnPtr = &newList;
return returnPtr;
}
int main() {

//create List contents
int x [5] = {2, 4, 5, 7, 9};
int* y = x;
//create list: doesn't work.
ListNode* newList = createNewList(y, 5);
cout << "debug test: neList first val is " << newList->val << endl;
return 0;
}

使用 gdb,我发现错误在线:

ptr->next = &newElement;

在 while 循环之后,列表包含元素 {2, -1, -1, -1, -1}。我相信这是因为我只是在newElement的地址旁边设置ptr->,而不是创建一个与newElement相同的ListNode的新实例并在它旁边设置ptr->。

但我认为为了避免这种情况,并确保"="符号产生深层副本,我只需要重载 ListNode 类中的赋值运算符,我做到了。

此外,在 createNewList fn 结束之前,returnPtr->val 的值为 2(我用 gdb 验证了这一点(,但 cout 语句每次打印不同的值,因此它是某种形式的未定义行为。我不明白原因。

如果我研究并发现任何新的东西,我会分享。我还可以根据要求提供更多信息。我真的很想了解指针移动语义,因此链接到可能适用的其他情况或文章将大有帮助:)

感谢您阅读:)任何信息不胜感激!

您正在堆栈上创建列表元素,因此一旦您离开函数,它们就会消失。

而不是

ListNode newElement = ListNode(-1);

尝试

ListNode* newElement = new ListNode(-1);

例如

ListNode*  createNewList(int* x, int length) {
if (x == nullptr) return x;
ListNode* newList = new ListNode(-1);
ListNode* ptr = newList;
int count = 0;
while (count < length) {
ptr->val = *(x + counter);
ListNode* newElement = new ListNode(-1);
ptr->next = newElement;
ptr = ptr->next;
counter++;
}
return newList;
}

这是不必要的

int x [5] = {2, 4, 5, 7, 9};
int* y = x;
//create list: doesn't work.
ListNode* newList = createNewList(y, 5);

你可以直接传递 x

ListNode* newList = createNewList(x, sizeof(x)/sizeof(*x));

为什么不

std::list<int> newlist {x, x+length};

相关内容

  • 没有找到相关文章

最新更新