【发布时间】: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