带头结点的单链表实现就地逆置的更优方法

在习惯上,我们在实现链表的逆置时都会采用从第一个结点开始遍历并不断将链表的指向逆置的方法,但这样做效率其实不高。假设要逆置的链表为L,更好的方法是先用指针p保存L-〉next,再将链表L的头结点置为Null,亦即L-〉next=Null,而后将p所指向的原存在于L的各个结点插入在已经置空的L中,作为L的第一个元素结点,p则每次下移用于记录剩下结点的位置。具体代码如下:

p=L->next;

L->next=NULL;

while(p&&p->next)//该循环的限制条件意在说明空表和只含一个元素结点的空表不用参加逆置

{

   s=p->next;//指针s防止可以结点地址丢失

   p->next=L->next;

   L->next=p;

   p=s;

}

注:我一开始的代码是这样的

firstNode=p=L->next;

L->next=NULL;

while(p&&p->next)//该循环的限制条件意在说明空表和只含一个元素结点的空表不用参加逆置

{if(p!=firstNode){

   s=p->next;//指针s防止可以结点地址丢失

   p->next=L->next;

   L->next=p;

   p=s;

  }//end if

  else{

    s=p->next;

   p->next=NULL;//其实该式与p->next=L->next;结果是一样的,判断语句完全不必要

   L->next=p;

   p=s;

  }//end else

}

不难发现,进行条件判断其实是多余的,以后更要注意这种情况,以提高代码简洁性


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值