[英]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;
}
代码可以简化:
next
和prev
指针,并在当前节点为最后一个时返回当前节点。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.