小白算法积累——单链表5#带头结点单链表+就地逆置

题目:试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1)。
关键字:带头结点的单链表+就地逆置

思路1
就地逆置:依次摘下每个结点,利用头插法重接接回L
1.将头结点摘下,
需要变量:L
2.从第一结点开始,依次插入到头结点后面(头插法)直到最后一个结点为止
需要变量:遍历工作指针p,(像个牙签似的,一次一次把串串上的羊肉挑到另一个串串上) 后继指针r(防止断链,即找不到原来的羊肉串串)

LinkList Reverse_1(LinkList L){
  LNode*p,*r;//p为工作指针,r为p的后继,以防断链
  p=L->next;//从第一个元素结点开始
  L->next=NULL;//先将头结点L的next域置为NULL
  while(p!=NULL){//依次将元素结点摘下
     r=p->next;//暂存p的后继
     p->next=L-next;//将p的结点插入到头结点之后
     L-next=p;
     p=r;
  }
  return L;
}

思路2
依次直接把每个结点的指针从指向后继结点改为指向前驱结点。
假设pre、p和r指向3个相邻的结点,如下图所示。
假设经过若干操作后,*pre之前的结点的指针都已调整完毕,它们的next都指向其原来的前驱结点。
现在令 *p结点的next域指向 *pre结点,注意到一旦调整指针的指向后, *p的后继结点的链就会断开,为此需要用r来指向原 *p的后继结点。

处理时需要注意两点:(其实就是最终链表“头”和“尾”的妥善处理)
1.在处理第一个结点时,应将其next域置为NULL,因为它将作为新表的尾结点。
2.在处理完最后一个结点后,需要将头结点的指针指向它。

在这里插入图片描述

LinkList Reverse_2(LinkList L){
  LNode *pre,*p=L->next,*r=p->next;
  p->next=NULL;//处理第一个结点,它的最终命运是成为最后一个结点,所以指向NULL
  while(r!=NULL{//r为空,则说明p为最后一个结点
    pre=p;//依次继续遍历
    p=r;
    r=r->next;
    p->next=pre;//指针反转
   }
   L->next=p;//处理最后一个结点
   return L;
  }
  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值