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;

}

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

图片描述

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

阅读 2.3k
2 个回答
//递归实现反转链表
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;

...