C语言单链表反转代码详解及常见错误分析
C语言单链表反转代码详解及常见错误分析
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *reverse( struct ListNode *head );
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf('%d ', p->data);
p = p->next;
}
printf('\n');
}
int main()
{
struct ListNode *head;
head = createlist();
head = reverse(head);
printlist(head);
return 0;
}
struct ListNode *reverse( struct ListNode *head )
{
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode *prev = NULL;
struct ListNode *curr = head;
struct ListNode *next = NULL;
while (curr) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
编写这段代码时容易出现什么问题和错误,请举例,并给出解决办法
在编写这段代码时可能会出现以下问题和错误:
-
**没有对链表为空的情况进行处理:**如果输入的链表为空,即head为NULL,则在reverse函数中的第一行判断语句中就会出现空指针解引用错误。
**解决办法:**在reverse函数中的开头加入判断,如果head为NULL,则直接返回NULL。
-
**循环条件错误:**在reverse函数中的循环条件应该是curr != NULL,而不是curr。否则在链表遍历到最后一个节点时,curr会变为NULL,循环就会提前终止。
**解决办法:**将循环条件修改为curr != NULL。
-
**没有更新head指针:**在main函数中,通过调用reverse函数来获得反转后的链表,但是忘记将反转后的链表赋值给head指针。
**解决办法:**在reverse函数的返回语句前,将反转后的链表赋值给head指针。
-
**输出结果错误:**在printlist函数中,遍历链表的循环条件应该是p != NULL,而不是p。否则在遍历到最后一个节点时,会出现空指针解引用错误。
**解决办法:**将循环条件修改为p != NULL。
原文地址: https://www.cveoy.top/t/topic/deQZ 著作权归作者所有。请勿转载和采集!