Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures 克隆随机指针的链接列表时出现未知错误_Data Structures_Linked List_C++14 - Fatal编程技术网

Data structures 克隆随机指针的链接列表时出现未知错误

Data structures 克隆随机指针的链接列表时出现未知错误,data-structures,linked-list,c++14,Data Structures,Linked List,C++14,C++代码 有一个用于克隆链表的C++代码 详情请参阅 Node* getNewNode(int data) { Node *newNode = new Node(); newNode->next = NULL; newNode->data = data; newNode->arb = NULL; return newNode; } Node * copyList(Node *head) { Node *cur = head, *

C++代码
有一个用于克隆链表的C++代码 详情请参阅

Node* getNewNode(int data)
{
    Node *newNode = new Node();
    newNode->next = NULL;
    newNode->data = data;
    newNode->arb = NULL;
    return newNode;
}
Node * copyList(Node *head)
{
    Node *cur = head, *copy=NULL, *copy_cur, *next;
    while(cur)
    {
        if(!copy)
        {
            copy = getNewNode(cur->data);
            copy_cur = copy;
        }
        else
        {
            copy_cur->next = getNewNode(cur->data);
            copy_cur = copy_cur->next;
        }
        cur = cur->next;
    }
    copy_cur = copy;
    cur = head;
    while(cur)
    {
        next = cur->next;
        cur->next = copy_cur;
        copy_cur->arb = cur;
        copy_cur = copy_cur->next;
        cur = next;
    }
    copy_cur = copy;
    while(copy_cur)
    {
        copy_cur->arb = copy_cur->arb->arb->next;
        copy_cur = copy_cur->next;
    }
    return copy;
}

任何人都可以帮助我理解这个实现中的错误。

您的代码中有两个地方需要更正。 您的第一个while循环只是创建一个新的单链接列表,其中设置了下一个指针,而不是“arb”指针。与其创建一个完整的新列表,不如只在原始列表中嵌入新节点。之后设置随机指针会更容易

Node newlyClonedNode = createNewNode(node->data);
newlyClonedNode->next = node->next;
node->next = newlyClonedNode;
然后再次遍历列表并设置新克隆节点的随机指针

node->next->arb = node->arb->next;
完成后,将新列表从原始列表中断开,这样就可以恢复原始列表以及设置了随机指针的新克隆列表

Node clonedNode = node->next;
node->next = node->next->next;

clonedNode->next = clonedNode->next->next;

第一个
while
循环生成副本(除了不设置
arb
指针,只设置
next
;实际上,它生成一个单链接列表)。第二个
while
循环做了一件非常奇怪的事情——它将原始列表撕开,使每个节点的
下一个
指向新列表中相应的节点。基本上,您会得到两个平行的单链接列表-新列表与
next
连接,原始列表与
arb
连接,
next
指针从旧一点指向新一点,
arb
指针从新一点指向旧一点。这毫无意义。