【问题标题】:Reversing a Doubly-Linked List with Values用值反转双向链表
【发布时间】:2018-03-05 18:29:23
【问题描述】:

我目前无法获得双向链表的反向函数来正确处理分配,我已经阅读了其他线程并在谷歌上搜索,但通常不同的是我的问题通过 常量 并且它返回一个“dlist”。教授提供了一个“代码测试器”,它说我的代码在执行“reverse(reverse(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节点都有一个指向前一个节点的指针和一个指向下一个节点的指针。 dlist 节点还包含一个 int 值。

我尝试实现的是创建一个从原始列表的“尾部”或结尾开始的列表。然后该列表将向后移动并随着它的前进交换“下一个”和“上一个”指针。我做错了什么?

已解决:通过使用 push_front 函数将值添加到列表的前面并将其他所有内容推到后面,我能够从给定的常量 dlist 中获取值,然后 push_front all将值转换为“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;
}

【问题讨论】:

  • 我想你在这里丢了一个{if(l.head()!=nullptr)。如果没有,你有更大的问题。
  • 添加main 构建一个简单的列表然后调用reverse 会很好地解决这个问题,最终是您。到那时你几乎会有一个minimal reproducible example,我们对这里的 MCVE 很感兴趣。
  • 感谢您的建议,是的,我不小心把 {
  • 您的列表是否有InsertFront 或类似功能?如果是这样,则为源列表中的所有项目创建一个空列表并在空列表上调用InsertFront
  • 是的,我确实有 push_front/InsertFront,感谢您,我目前正在尝试这种方法。

标签: c++ reverse doubly-linked-list


【解决方案1】:

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

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

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

【讨论】:

  • 是的,push_front 函数只需要一个值放入 dlist,我从另一个函数获得的值从“const dlist”中获取所述值。测试人员本质上是在检查原始列表是否与两次反转的“返回列表”匹配。在使用 push_front 函数使用原始 dlist 中的值设置我的“新 dlist”后,它可以完美运行。
猜你喜欢
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
相关资源
最近更新 更多