当前位置: 首页 > 知识库问答 >
问题:

使用值反转双链接列表

裴泰平
2023-03-14

我目前无法获得双链接列表的反向函数来正确处理作业,我已经阅读了其他线程并在谷歌上搜索,但通常不同的是,我的问题以常量传递,它返回一个“dlist”。教授提供了一个“代码测试仪”,它说我的代码在执行“反向(反向(dlist c))”时,并不等于它本身就是“c”。[反转两次并不等于它本身]。

dlist类是:

class dlist {
public:
dlist() { }
int sizeOfDlist =0; // To keep track of size 
struct node {
    int value;
    node* next;
    node* prev;
};

node* head() const { return _head; } // _head = beginning of list
node* tail() const { return _tail; } // _tails = end of list
node* _head = nullptr;
node* _tail = nullptr;

这是反向函数:

dlist reverse(const dlist& l){
if(l._head == nullptr||l._tail ==nullptr){ // Checks if l list is empty
    dlist newRList;
    return newRList;//return a blank list;
}

if(l.head()!=nullptr){
    dlist::node* temp;
    dlist::node* ptr1 = l._head;
    dlist::node* previous = nullptr;

    while(ptr1 != nullptr){
        temp = ptr1->next;
        ptr1->next = previous;
        previous = ptr1;
        ptr1 = temp;
    }
    dlist newRList;
    newRList._head = previous;
    return newRList;
   }
else //if something passes by, return original list
    return l;
}

每个数据列表节点都有一个指向前一个节点的指针和一个指向下一个节点的指针。dlist节点还包含一个int值。

我试图实现的是创建一个从原始列表的“尾部”或结尾开始的列表。然后列表会向后移动,并在前进过程中交换“下一步”和“上一步”指针。我做错了什么?

解决方案:通过使用一个push_front函数,该函数将一个值添加到列表的前面,并将其后面的所有内容推送,我能够从给定的常量dlist中获取值,并将所有值push_front到"newRList"中,从而颠倒顺序。

感谢user4581301和Basya Perlman对我的帮助,以下是新的反转功能:

dlist reverse(const dlist& l){
if(l._head == nullptr||l._tail ==nullptr){ // Checks if l list is empty
    dlist newRList;
    return newRList;//return a blank list;
}

if(l.head()!=nullptr){
   dlist newRList;
   for(int n=0; n<l.size(); n++){ // Size function checks the size of the doubly linked list 

       newRList.push_front(l.valueGetter(n)); // Value Getter is a function that grabs the value at a specific [iteration], push_front pushes said value into the front of the list.
    }
    return newRList;
}
else //if something passes by, return original list 
    return l;
}

共有1个答案

刘永望
2023-03-14

您的反向函数看起来像是被设置为返回一个新的dlist。它返回一个对象,而不是指针或引用。

此外,您的参数是一个constdlist,但您试图在适当的位置将其反转,然后将一个新指针指向列表的开头并返回它。然后测试人员将返回的列表与原始列表进行比较;但是原来的列表,本来应该是const,但是被修改了吗?我有点困惑,所以运行你的程序的计算机可能太复杂了:-)

从函数定义来看,这个想法似乎是通过以相反的顺序将元素复制到新列表中,并保持原始列表不变来创建一个新列表。在您的评论中,您有一个push_back和一个push_front函数;您可以向前循环现有列表,并push_front每个元素的副本到新列表中,以将其逆转(是否需要显式复制取决于push_front函数的定义,我没有)。

 类似资料:
  • 我正在尝试反转一个链表,我为此编写了代码。但是,当我在反转后打印列表时,输出有点不完整。 产量:120 110 100

  • 我试图打印一个双链接列表,从tail元素开始,以first元素结束。我下面的代码就是这样做的,但出于某种原因,我也返回了被删除的项目。当我从头到尾打印列表时,它不会这样做。Idk,如果是toString导致了这个或dequed方法。我把两者都包括在内。

  • 我在分析一个删除节点的双链表函数。然而,我有点困惑。 为什么有一个tmp=p.prev和p.prev=tmp。这些额外线路的用途是什么?最后,为什么没有使用“del”删除节点?代码末尾不应该是“delp”吗? 非常感谢。

  • 我试图初始化一个双链接列表,其中包含另一个双链接列表中的虚拟节点(也包含虚拟节点)。例如,学生列表中的一个节点有许多朋友存储在该节点内的链接列表中。这是我的代码: 当我试图编译它时,它告诉我:警告:来自不兼容指针类型的赋值。它出现在我发表评论的台词上。请帮忙^^ 编辑:谢谢鸭嘴兽!

  • 我已经得到了实现双向链表的框架。我被PushFront()方法难住了。方法应该将提供的元素添加到链表的前面,并且应该将地址返回到新的头节点。我对如何访问列表的当前头部感到困惑,以便我可以将其分配给pNext指针。到目前为止,PushTop()方法看起来是这样的: 元素类构造函数: 数据类: 主要: 我的理解是,您通常会在调用PushFron()时提供头的地址,但是因为我没有提供,我不确定如何访问它

  • 我正在尝试创建二维双链接圆形阵列,从txt文件读取数据并自动创建节点。我的程序正在正确地读取第一行,但当它到达下一行并开始创建下一个节点时,会出现空指针。我不明白为什么会这样,请帮帮我。 这些都是错误。Null指针在尝试创建第二个节点时发生。它正确地创建第一个节点,而不是紧接着创建空指针。 第77行=位置next=n; 第69行=插入后(head.prev, x); 第18行=mList。镶片(k