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