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

链表反转与打印异常排查:代码无编译错误但无输出

链表反转代码问题分析与修复

问题根源

你的代码无输出且功能不符合预期,核心问题有三个:

  1. 传值参数无效:所有操作链表的函数都使用了传值的node* head参数,函数内对head的修改不会同步到外部变量(比如main里的r),而且类的私有成员node* head完全没被使用,导致链表根本没被正确构建,print自然输出空。
  2. 插入逻辑与期望不符:原insertl是头插法,按你插入1、2、5...的顺序,实际链表会是11->9->7->5->2->1,和你期望的首次打印1,2,5,7,9,11完全相反。
  3. 缺失反转后的打印:main函数调用reverse后没有再次调用print,就算反转成功也看不到结果。

修复后的完整代码

#include <iostream>
using namespace std;

class node {
public:
    int data;
    node *next;
    node(int val) : data(val), next(nullptr) {} // 构造函数简化节点创建
};

class linkedl{
public:
    linkedl() : head(nullptr) {} // 构造函数初始化头指针
    void insertl(int data); // 改为尾插,匹配期望的打印顺序
    void reverse();
    void print();
private:
    node* head; // 用类成员统一管理链表头
};

// 尾插法:新节点追加到链表末尾,保证插入顺序和打印顺序一致
void linkedl::insertl(int data) {
    node *newNode = new node(data);
    if (head == nullptr) {
        head = newNode;
    } else {
        node* temp = head;
        while (temp->next != nullptr) {
            temp = temp->next;
        }
        temp->next = newNode;
    }
}

void linkedl::reverse() {
    node *nextNode, *prevNode, *currentNode;
    currentNode = head;
    nextNode = nullptr;
    prevNode = nullptr;

    while (currentNode != nullptr) {
        nextNode = currentNode->next;
        currentNode->next = prevNode;

        prevNode = currentNode;
        currentNode = nextNode;
    }

    head = prevNode; // 更新类的头指针为反转后的新头
}

void linkedl::print() {
    node *temp = head;
    while (temp != nullptr) {
        cout << temp->data;
        if (temp->next != nullptr) {
            cout << ", ";
        }
        temp = temp->next;
    }
    cout << endl;
}

int main() {
    linkedl ha;
    ha.insertl(1);
    ha.insertl(2);
    ha.insertl(5);
    ha.insertl(7);
    ha.insertl(9);
    ha.insertl(11);

    cout << "反转前链表:";
    ha.print();

    ha.reverse();

    cout << "反转后链表:";
    ha.print();
}

关键修改说明

  • 改用类私有成员管理链表头:去掉函数中的head参数,直接操作类的head成员,确保链表的修改能被正确保存和传递。
  • 替换为尾插法:原头插法会颠倒插入顺序,尾插法保证插入的1、2、5...按顺序存入链表,首次打印符合预期。
  • 添加构造函数:简化节点和链表的初始化流程,避免空指针隐患。
  • 补充反转后的打印逻辑:main函数中反转后调用print,输出反转结果。
  • 优化打印格式:输出改为逗号分隔的紧凑格式,更贴近你期望的输出样式。

内容的提问来源于stack exchange,提问作者Henok Mulugeta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:55:00