簡體   English   中英

如何反轉雙向鏈表?

[英]How to reverse doubly Linked list?

有人可以幫我嗎? 為什么它顯示運行時錯誤

Node* rev(Node*head)
{
    if(head==NULL || head->next==NULL)
    {
        return head;
    }

    Node * chotahead =rev(head->next);
    head->next->next=head;
    head->prev=head->next;
    head->next=NULL;
    return chotahead;
}


Node* reverseDLL(Node * head)
{

    head=rev(head);
    return head;
}

像這樣的東西怎么樣:

void Reverse_List(list * p_list)
{
    Node * p->head = p_list->p_head;
    Node * p_new_head = p_list->p_head;
    while (p->head)
    {
       p_temp = p_head->next;
       p_head->next = p_new_head;
       p_new_head = p_head;
       p_head = temp;
    }
    list->p_head = p_new_head;
}

上面代碼的想法是從一個新的空列表開始。 遍歷現有列表,並將節點移動到新列表的頭部。

最后,使列表的頭部指向新列表。

注意:上面的代碼沒有使用遞歸,對堆棧的影響很小。

每次迭代都會設置下一個節點的next指針和當前節點的上一個prev 這使得最后一個節點的prev指針和第一個節點的next指針未設置。 修復這使得代碼工作。

[演示]

Node* rev(Node* head) {
    if (head->next == nullptr) {
        head->prev = nullptr;  // last node's prev
        return head;
    }

    Node* chotahead = rev(head->next);
    head->next->next = head;  // next node's next
    head->prev = head->next;  // current node's prev
    return chotahead;
}

Node* reverseDLL(Node* head) {
    if (head == nullptr) {
        return head;
    }
    Node* ret = rev(head);
    head->next = nullptr;  // first node's next
    return ret;
}

代碼可以簡化:

  • 不需要兩個功能。
  • 不需要遞歸。
  • 您可以遍歷原始列表,交換nextprev指針,並在當前節點為最后一個時返回當前節點。

[演示]

Node* reverse(Node* head) {
    Node* ret{nullptr};
    while (head != nullptr) {
        ret = head;
        head = std::exchange(head->next, head->prev);
    }
    return ret;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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