數據結構學習-帶頭結點的單鏈表就地逆置


 

所謂“就地是指輔助空間復雜度為O(1)。

解法一:將頭結點摘下,然后從第一結點開始,依次前插入到頭結點的后面(頭插法),直到最后一個結點為止。

 

代碼如下

LinkList Reverse (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;
}

解法二:

通過若干操作將指針反轉達到逆置的目的。

假設pre、p和r指向3個相鄰的結點,如上圖。*pre之前的結點的指針都已經調整完畢,它們的next指針都指向其原前驅結點。現在令*p結點的next域指向*pre結點,注意到一旦調整指針的指向后,*p的后繼結點的鏈就斷開了,為此用r來指向原*p結點的后繼結點。

處理第一個結點時,將其next域置為NULL,。處理最后一個結點后,將頭結點的指針指向它。

代碼:

Linklist reserve(LinkList L)
{
  LNode *pre,*p=L->next,*r=p->next;
  p->next=NULL;//處理第一個結點
  while(r!=NULL)//r為空,則說明p為最后一個結點

  {
    pre=p;//依次遍歷
    p=r;
    r=r->next;
    p->next=pre;//指針反轉
  }
  L->next=p;//處理最后一個結點
  return L;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM