【问题分析】单链表的逆置就是将表中内容由原来的(a1,a2,a3,...,an)转换为(an,an-1,...a3,a2,a1)。就地逆置就是不需要额外的申请结点空间,只需要利用原有的表中的结点空间。
上图中第一个链表就是原有的带头结点初始链表,第二条链表为逆置后的链表。在解决链表的问题中,画图是一个重要的解决问题的手段。
【解答一】:三指针法
第一步:定义三个指针 pre,s,p,并将其初始化pre=NULL,s=NULL,p=head->next,然后判断p是否为空。
第二步:将p赋给s,即s=p;
第三步:指针p向后移动;
第四步:将pre的值赋给s->next
第五步:pre=s;
以下是执行一次五个步骤的图示
#include<assert.h>
void ReverseList(LinkList head)
{
assert(head);
ListNode*pre=NULL,*s=NULL;
ListNode*p=head->next;
while(p!=NULL)
{
s=p;
p=p->next;
s->next=pre;
pre=s;
}
head->next=pre;