You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双向链表反转异常求助:插入中间节点后反转失效问题排查

双向链表反转失效问题排查

问题现象

这段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:36:20