【问题分析】单链表的逆置就是将表中内容由原来的(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;

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐