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