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

单链表反转:排查现有代码逻辑错误

单链表反转代码错误排查与修正

原代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head==NULL || head->next==NULL)
            return head;
        ListNode *p=NULL;
        ListNode *q=NULL;
        ListNode *r=NULL;
        r=head;
        q=head->next;
        if(q->next){
            p=q->next;
        }else{
            q->next=r;
            return q;
        }
        while(p){
            q->next=r;
            r=q;
            q=p;
            p=p->next;
        }
        head->next=NULL;
        return q;
    }
};

问题描述

我知道这是链表最基础的问题之一,先在纸上推演后编写了这段单链表反转代码,但不知为何运行报错。请帮忙指出代码中的逻辑错误及修正方法?
注:请勿提供全新解决方案,仅帮忙排查现有代码问题。


错误点与修正方法

  • 核心逻辑缺失:循环结束后未完成最后一个节点的指向
    你的while(p)循环仅在p不为空时执行q->next = r操作,当p为空退出循环时,q是原链表的最后一个节点,r是原链表的倒数第二个节点,但q的next仍保持原链表的NULL,未指向r,这会导致反转后的链表断裂,最后一个节点无法连接到前面的节点,同时原头节点的next会形成环。

    修正方法:在while循环结束、head->next=NULL之前,添加一行q->next = r;,完成最后一个节点的指向修正。

修正后的关键代码片段

// ... 前面代码不变
while(p){
    q->next=r;
    r=q;
    q=p;
    p=p->next;
}
q->next = r; // 新增这一行
head->next=NULL;
return q;

内容的提问来源于stack exchange,提问作者Prakritish Ghosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:52:37