[英]Why does this code fail to reverse a doubly linked list
我試着避免在這里問這個問題,但是在看了同一條代碼將近一個小時之后,我真的不知道為什么下面的代碼無法反轉雙向鏈表:
Node* Reverse(Node* head) {
if (head == nullptr) {return head;}
Node *iter = head, *tail, *newTail;
while (iter -> next != nullptr) {iter = iter -> next;} //to set the tail pointer
tail = iter;
newTail = tail; //the node that will become the tail after reversing is done
iter = head;
while (iter != tail) {
newTail -> next = iter;
iter -> prev = newTail;
newTail = iter;
iter = iter -> next;
}
newTail -> next = nullptr;
tail -> prev = nullptr;
return tail;
}
我將不勝感激任何幫助。
編輯似乎代碼與我的想法無關。 哇。 附帶說明,我僅完成了入門編程課程,不涉及指針,更不用說鏈接列表了。謝謝您的幫助!
最終代碼如果您有興趣,我已經完成了反轉雙向鏈表的算法。 我認為這是一個不錯的方法,盡管我當然願意提出建議。
node *reverse(node *head)
{
if (head == nullptr) {return head;}
node *iter, *tail, *temp, *newTail;
while (iter -> next != nullptr) {iter = iter -> next;}
tail = iter;
newTail = tail;
iter = tail -> prev;
while (iter != nullptr)
{
temp = iter -> prev;
newTail -> next = iter;
iter -> prev = newTail;
newTail = iter;
iter = temp;
}
tail -> prev = nullptr;
newTail -> next = nullptr;
return tail;
}
在代碼中,newTail始終是迭代的。 在while循環中,將newTail-> next設置為iter,將iter-> prev設置為newTail。 哪個沒有效果。
也許這張圖會有所幫助
嘗試這個。 它遍歷列表,並為每個節點交換下一個和上一個指針。 (這可能不是最有效的算法。)
Node* Reverse2(Node* head) {
if (head == nullptr) {return head;}
Node *iter = head;
Node *tail = nullptr;
while (iter!=nullptr) {
tail = iter; //keep track of tail
Node *tmp = iter->next; //before swap, pre-fetch next node
swap(iter);
iter=tmp; //go to next node
}
return tail;
}
void swap(Node *n) {
Node *tmp = n->prev;
n->prev = n->next;
n->next = tmp;
}
假設您有3個元素,將它們編號為0、1、2。因此,從newTail開始,指向最后一個元素(2)。 然后從頭開始(0)並設置newTail->next = iter
。 那么現在2鏈接到0了嗎? 聽起來不像是倒轉名單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.