单链表反转:排查现有代码逻辑错误
单链表反转代码错误排查与修正
原代码
/** * 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
相关产品推荐
相关产品推荐

