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