st* reverse(st* head)
{
st* p1;
st* p2;
p1=NULL;
p2=head;
while(p2!=NULL)
{
p2->next=p1;
p1=p2;
p2=p2->next;
if(p2->next==NULL)
{
p2->next=p1;
p1=p2;
}
}
head=p1;
return head;
}
st* reverse(st* head) {
st* p1;
st* p2;
p1=NULL;
p2=head;
while(p2!=NULL) {
p2->next=p1;
p1=p2;
p2=p2->next;
if(p2->next==NULL) {
p2->next=p1;
p1=p2;
}
}
head=p1;
return head;
}
关键点:第一次进入while循环的时候,第7行将p1(此时p1为null)赋值给p2->next,然后在第9行,p2=p2->next;岂不是将null赋值给p2,这可不是指针后移。
你这明显是没有理解链表的反序原理啊,建议先理解一下原理,画一下图,写个伪代码,然后在用c语言进行实现
st* reverse(st* head)
{
st* p1;
st* p2;
st* p3;
p2=head;
p1=p2->next;
p2->next=NULL;
p3=NULL;(p3指针初始化)
while(p1)
{
p3=p1->next;
p1->next=p2->next;
p2->next=p1;
p1=p3;
}
return p2;
试试这个头插法
建议给代码加上高亮,支持 markdown 代码高亮语法
– dudu 5年前