C++ 以与另一个列表相反的顺序创建第二个单链接列表

C++ 以与另一个列表相反的顺序创建第二个单链接列表,c++,list,linked-list,reverse,singly-linked-list,C++,List,Linked List,Reverse,Singly Linked List,我需要创建一个函数,它接受一个普通的单链接列表,并以与第一个列表相反的顺序创建另一个列表,新列表中的第一个元素将是原始列表中的最后一个元素,依此类推 出于某种原因,我的函数只会在整个新列表中反复返回相同的数字。因此,如果我的原始列表中的最后一个数字是“50”,那么新列表将完全由“50”组成 这是我的代码,我做错了什么?如果有人想让我发布整个程序,以便更清晰或更具背景,请告诉我 void invert() { node *list1=top,*newlist,*temp,*prev;

我需要创建一个函数,它接受一个普通的单链接列表,并以与第一个列表相反的顺序创建另一个列表,新列表中的第一个元素将是原始列表中的最后一个元素,依此类推

出于某种原因,我的函数只会在整个新列表中反复返回相同的数字。因此,如果我的原始列表中的最后一个数字是“50”,那么新列表将完全由“50”组成

这是我的代码,我做错了什么?如果有人想让我发布整个程序,以便更清晰或更具背景,请告诉我

void invert() {
    node *list1=top,*newlist,*temp,*prev;
    while (list1->next!=NULL) {
        list1=list1->next;
    }
    newlist=new node;
    newlist->num=list1->num;
    newlist->next=NULL;
    if (top2==NULL) {
        top2=newlist;
    }
    else {
        for (temp=top2;temp!=NULL;temp=temp->next) {
            prev=temp;
        }
        prev->next=newlist;
    }
    list1->next=NULL;
}

您的代码不能正确,因为它只创建一个新节点,然后修改现有节点中的下一个链接。根据您的需求,您必须创建一个新列表,这意味着克隆所有节点并按相反顺序链接它们

根据@user4581301的建议,我提出了以下建议:

node* invert(node* list)
{
    node* inverted = NULL;
    // run through original in order
    for (node* p = list; p != NULL; p = p->next) 
    {
        // clone the node
        node* newNode = new node(); 
        newNode->num = p->num;
        // and link it so that the predecessor in the original list
        // (which has been processed in the previous iteration) is
        // linked as next node
        newNode->next = inverted;
        inverted = newNode;
    }
    return inverted;
}

您的代码不能正确,因为它只创建一个新节点,然后修改现有节点中的下一个链接。根据您的需求,您必须创建一个新列表,这意味着克隆所有节点并按相反顺序链接它们

根据@user4581301的建议,我提出了以下建议:

node* invert(node* list)
{
    node* inverted = NULL;
    // run through original in order
    for (node* p = list; p != NULL; p = p->next) 
    {
        // clone the node
        node* newNode = new node(); 
        newNode->num = p->num;
        // and link it so that the predecessor in the original list
        // (which has been processed in the previous iteration) is
        // linked as next node
        newNode->next = inverted;
        inverted = newNode;
    }
    return inverted;
}

现在是学习如何调试小程序的好时机:在from列表中向前迭代。对于每个节点,复制它并将副本插入到to列表的开头。对于每个节点,复制它并将副本插入到“收件人”列表的开头。