繁体   English   中英

用值反转双链表

[英]Reversing a Doubly-Linked List with Values

我目前无法获得双向链表的反向功能以正确执行分配任务,我已经阅读了其他线程并在Google上进行了搜索,但通常的区别是我的问题传入了一个常数 ,并且它返回一个“ dlist”。 教授提供了一个“代码测试器”,它说我的代码在执行“ reverse(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值。

我试图实现的是创建一个从原始列表的“尾部”开始或结束的列表。 然后,该列表将向后移动,并随着其进行交换“ next”和“ prev”指针。 我究竟做错了什么?

解决:通过使用将一个值添加到列表的开头并将所有其他内容推入列表的push_front函数,我能够从给定的常量dlist中获取值,并将所有值推入“ 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;
}

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

同样,您的参数是const dlist,但是您尝试将其原位反转,然后将新指针指向列表的开头并返回该指针。 然后,测试人员将返回的列表与原始列表进行比较; 但是原始列表本来是const ,但是被修改了呢? 我有点困惑,所以也许运行您的程序的计算机也太:-)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM