这种写法之前还真的没有接触过,段错误的提示感觉有点怀疑人生,基本上都是指针用错了,我直接新建了一个列表,然后使用头插法将其插入就可以了,注意新建指针一定要定义为NULL.
看到其他人的写法是直接修改变量的next指向,这种方法是第二种解法,但是我初始写的有问题所以后面进行了修改,不知道错误的原因是什么。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        ListNode* rHead=NULL;
        ListNode* r=NULL;
        //对于头节点先插入
        while(pHead!=NULL){
            int tmp=pHead->val;
            r=new ListNode(tmp);
            if(rHead==NULL){
                rHead=r;
            }else{
                r->next=rHead;
                rHead=r;
            }
            pHead=pHead->next;
        }
        return rHead;
    }
};

然后是第二个解法
图片说明
/*
struct ListNode {
int val;
struct ListNode next;
ListNode(int x) :
val(x), next(NULL) {
}
};
/

class Solution {
public:
    //直接指针反转的做法
    ListNode* ReverseList(ListNode* pHead) {
        //只有一个节点的情况,多加这一行就没有问题了,不然会堆栈错误
        //然而我并不知道是为什么
        if(pHead==NULL) return NULL;
        if(pHead->next==NULL){
            return pHead;
        }else{
            ListNode* l=pHead,*m=pHead->next,* r=m->next;
            l->next=NULL;
            while(r){
                m->next=l;
                l=m;
                m=r;
                r=r->next;
            }
            m->next=l;
            return m;
        }
    }
};