C语言链表逆置 小白无法解决的段错误

题目描述

链表逆置
本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表结点定义如下

struct ListNode {

int data;

struct ListNode *next;

}

题目来源及自己的思路

题目来源
https://pintia.cn/problem-set...
我采用的方法是头插法(这个链表应该是没有头节点)

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

这是我自己的答案
struct ListNode reverse(struct ListNode head)
{

struct ListNode *p, *q;

p = head->next;

head->next = NULL;

while (p != NULL)

{

q = p;

p = p->next;

q->next = head;

head = q;

}

return head;

}

你期待的结果是什么?实际看到的错误信息又是什么?

图片描述

百度过后貌似查到的代码都是带有头节点的头插法,我自己在草稿纸上画了几种情况也是觉得没问题,实在是没有头绪,还希望大神给我稍微指点迷津一下,谢谢呀

回答:

//递归实现反转链表

static NODE *reverseList(NODE *pHead)

{

NODE *p;

NODE *newHead;

if(pHead == NULL || pHead->next == NULL)

{

return pHead;

}

p = pHead->next;

newHead = reverseList(p);

p->next = pHead;

pHead->next = NULL;

return newHead;

}

//迭代实现反转链表

static NODE *reverseListIterator(NODE *pHead)

{

NODE *preNODE = NULL;

NODE *newHead = NULL;

NODE *curNODE = pHead;

while(curNODE != NULL)

{

NODE *tmp = curNODE->next;

if(tmp == NULL)

{

newHead = curNODE;

}

curNODE->next = preNODE;

preNODE = curNODE;

curNODE = tmp;

}

return newHead;

}

//尾递归实现反转链表

static NODE *reverseListTail(NODE *pHead,NODE *newHead)

{

NODE *pNext;

if(pHead == NULL)

{

return newHead;

}

else

{

pNext = pHead->next;

pHead->next = newHead;

return reverseListTail(pNext,pHead);

}

}

回答:

在函数开始的时候添加
if(head == NULL)

return head;

...

以上是 C语言链表逆置 小白无法解决的段错误 的全部内容, 来源链接: utcz.com/p/194156.html

回到顶部