反轉鏈表的遞歸與非遞歸實現(C++描述)


給定一個單向鏈表的頭結點,要求將鏈表反轉,並返回新的頭結點。

 

一、迭代實現

思路:遍歷鏈表,依次調整每個節點的指針域。

 

 定義 結點p指向當前節點

          結點q指向當前節點的下一個結點(p->next非空時)

          結點r指向當前節點的前一個結點

         節點newhead指向新頭結點()

初始 p=head,q=NULL,r = NULL;

當p不為空時:

            如果p->next非空  q = p->next

             p->next = r

             r = p

             p = q

最后r即為反轉后鏈表的新頭結點!

 

代碼實現:

Listnode * ReverseList(Listnode *head){
    if(head->next == NULL) return head;
    
    Listnode *p,*q,*r;
    p=head;q=r=NULL;
    
    while(p!=NULL){
        //if(p->next!=NULL) 
        q = p->next;
        p->next = r;
        r = p;
        p = q;
    }
    return r;    
}

二、遞歸實現

迭代法實現是順序遍歷從頭到尾改變指針指向,遞歸的特性是回溯,采用從后向前改變指針指向的方式來實現鏈表反轉。

ListNode* reverse(ListNode* H) {
    //包括特殊情況
    if (H == NULL || H->next == NULL)
        return H;
 
    ListNode *newH = reverse(H->next);//注意,此處的操作是一直循環到鏈表末尾
    H->next->next = H;//反轉每個節點的指向
    H->next = NULL;
 
    return newH;
}

 

參考:

鏈表反轉的圖文講解(遞歸與迭代兩種實現)

 


免責聲明!

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



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