数据结构学习-带头结点的单链表就地逆置

前端之家收集整理的这篇文章主要介绍了数据结构学习-带头结点的单链表就地逆置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

 

所谓“就地是指辅助空间复杂度为O(1)。

解法一:将头结点摘下,然后从第一结点开始,依次前插入到头结点的后面(头插法),直到最后一个结点为止。

 

代码如下

  1. LinkList Reverse (LinkList L)
  2. {
  3.   LNode *p,*r;//p为工作指针,r为p的后继以防断链
  4.   p=L->next;从第一个元素结点开始
  5.   L->next=NULL;先将头结点Lnext域置为NULL
  6.   while(p!=NULL)依次将元素结点摘下
  7.   {
  8.    r=p->next;暂存p的后继
  9.    p->next=L->next;p结点插入到头结点之后
  10.    L->next=p;
  11.    p=r;
  12.   }
  13.   return L;
  14. }

解法二:

通过若干操作将指针反转达到逆置的目的。

假设pre、p和r指向3个相邻的结点,如上图。*pre之前的结点的指针都已经调整完毕,它们的next指针都指向其原前驱结点。现在令*p结点的next域指向*pre结点,注意到一旦调整指针的指向后,*p的后继结点的链就断开了,为此用r来指向原*p结点的后继结点。

处理第一个结点时,将其next域置为NULL,。处理最后一个结点后,将头结点的指针指向它。

代码

  1. Linklist reserve(LinkList L)
  2. {
  3.   LNode *pre,*p=L->next,*r=p->next;
  4.   p->next=NULL;处理第一个结点
  5.   while(r!=NULL)r为空,则说明p为最后一个结点
  6.   {
  7.     pre=p;依次遍历
  8.     p=r;
  9.     r=r->next;
  10.     p->next=pre;指针反转
  11.   }
  12.   L->next=p;处理最后一个结点
  13.    L;
  14. }

 

猜你在找的数据结构相关文章