1. 程式人生 > >單鏈表就地逆置遞迴與非遞迴的方法

單鏈表就地逆置遞迴與非遞迴的方法

//1.用遞迴演算法,對於不帶頭結點的單鏈表(a1,a2,a3,a4,a5,a6)逆置後的結果為(a6,a5,a4,a3,a2,a1)
//考慮遞迴演算法,若只有一個結點,則直接返回,若存在兩個結點(a1,a2)則需要做的操作有:      a2->next=a1;a1->next=NULL;return a2;
//a2即新的頭結點,若有三個結點,則應先將子鏈(a2,a3)先逆置且返回該子鏈的新的頭結點,然後把子鏈(a2,a3)當作一個複合結點a2',
//組成新的二元組(a1,a2')然後就可以執行前面相同的操作:a2'->next=a1;a1->next=NULL;return a3';即可,多個以上的結點可同理得到,
Node *Reverse(Node *head)
{
 Node *p=head;
 if(p==NULL)
     return NULL;     //若是空連結串列,返回空
 Node *q=p->next;
 if(q==NULL)
     return p;     //若只有一個結點,直接返回
 else
     head=Reverse(q);  //記錄子序列的新的頭結點
 q->next=p;     //當前結點與已經逆置的子序列看成是前後的兩個結點p,q,作相應的逆置操作
 p->next=NULL;
 return head;      //返回新的子序列的頭結點
}


//2.用普通演算法迴圈逆置(頭插法重新建立帶頭結點的新連結串列)
Node *Reverse(Node *head)
{
 Node *p=head->next;
    if(p)//若連結串列不為空,則逆置,否則,空操作
 {
   Node *q=p->next;
   head->next=NULL;//頭結點分離
   while(p)
   {
    p->next=head->next; //頭插法建立連結串列
    head->next=p;
    if(q)    //操作空指標的時候一定要非常注意,很容易出錯
    {
      p=q;
      q=p->next;
    }
    else
      break;
   }
 }
 return head;
}