繁体   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