簡體   English   中英

為什么此代碼無法反轉雙向鏈表

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM