[英]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.