双向链表反转异常求助:插入中间节点后反转失效问题排查
双向链表反转失效问题排查
问题现象
这段C++双向链表代码中,调用insertatmiddle函数插入中间节点后,reverse函数仅能反转到插入节点的位置,无法完成整个链表的反转;但注释掉insertatmiddle的调用后,反转功能正常。
错误根源
问题出在insertatmiddle函数的指针赋值逻辑上:
temp->next->prev=newnode->next;
这行代码完全错误,正确逻辑应该是将原temp节点的下一个节点的prev指针指向新节点newnode,而不是指向newnode->next(此时newnode->next还未赋值,值为NULL)。这会导致插入位置后的节点与前面的链表断裂,链表被拆分为两段,反转时只能处理前半段。
修正后的代码
修复insertatmiddle函数
将错误行替换为正确的指针指向,同时增加插入位置为尾部的判断,避免空指针访问:
void insertatmiddle(Node* &head, int position, int d) { Node* temp=head; Node* newnode=new Node(d); int count=1; while(count<position-1) { temp=temp->next; count++; } // 处理插入到尾部的情况,避免空指针访问 if(temp->next == NULL){ insertattail(temp, d); return; } newnode->prev=temp; temp->next->prev=newnode; // 修正此处 newnode->next=temp->next; temp->next=newnode; }
可选:修复reverse函数的边界问题
当链表只有一个节点时,原reverse函数中temp最终为NULL,执行head=temp->prev会触发空指针错误,补充边界判断:
void reverse(Node* &head) { Node* current=head; Node* temp=NULL; while(current!=NULL) { temp = current->prev; current->prev = current->next; current->next = temp; current = current->prev; } // 处理链表为空或只有一个节点的情况 if(temp != NULL){ head=temp->prev; } }
完整修正代码
#include<iostream> using namespace std; class Node{ public: int data; Node* next; Node* prev; Node(int d) { this->data=d; this->next=NULL; this->prev=NULL; } }; void insertathead(Node* &head,int d) { Node* temp= new Node(d); temp->next=head; head->prev=temp; head=temp; } void insertattail(Node* &tail, int d) { Node* newnode=new Node(d); newnode->prev=tail; tail->next=newnode; tail=newnode; } void insertatmiddle(Node* &head, int position, int d) { Node* temp=head; Node* newnode=new Node(d); int count=1; while(count<position-1) { temp=temp->next; count++; } // 处理插入到尾部的情况 if(temp->next == NULL){ insertattail(temp, d); return; } newnode->prev=temp; temp->next->prev=newnode; newnode->next=temp->next; temp->next=newnode; } void reverse(Node* &head) { Node* current=head; Node* temp=NULL; while(current!=NULL) { temp = current->prev; current->prev = current->next; current->next = temp; current = current->prev; } if(temp != NULL){ head=temp->prev; } } void display(Node* head) { Node* temp=head; while(temp!=NULL) { cout<<temp->data<<" "; temp=temp->next; } cout<<endl; } int main() { Node* node1=new Node(10); Node* head=node1; Node* tail=node1; insertathead(head,11); display(head); insertathead(head,12); display(head); insertathead(head,13); display(head); insertathead(head,14); display(head); insertattail(tail,15); display(head); insertatmiddle(head,3,20); display(head); cout<<head->data<<endl; cout<<tail->data<<endl; reverse(head); display(head); return 0; }
内容的提问来源于stack exchange,提问作者Mohit Kumar
相关产品推荐
相关产品推荐

