这种写法之前还真的没有接触过,段错误的提示感觉有点怀疑人生,基本上都是指针用错了,我直接新建了一个列表,然后使用头插法将其插入就可以了,注意新建指针一定要定义为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; } } };