輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。

 

題目:輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。

分析:

方法(1):更改next指針域法。當沒有節點或者只有一個結點時,直接返回這個節點;否則至少有兩個節點時,用三個指針n1,n2,n3,n1指向第一個節點,n2指向第二個節點,n3指向第三節點(可能爲空),每次修改n2的next讓其指向n1,然後利用n3保存下一個節點,然後利用n2移動n1和n2的相對位置(需要注意的是,最開始要將n1的next域置空,因爲它反轉後要做尾節點)。

 ListNode* ReverseList(ListNode* pHead) {
        
        //沒有節點,或者只有一個節點,則就返回這個節點
        if (pHead == NULL || pHead->next == NULL)
            return pHead;

        //來到這說明至少有2個節點
        ListNode* n1 = pHead;//n1指向第一個節點
        ListNode* n2 = n1->next;//n2指向第二個節點
        n1->next=nullptr;//反轉後第一個節點要做尾節點,因此它的next指向nullptr
        
        ListNode* n3 = n2->next;//n3指向第三個節點(可能爲空)

        while (n2 != NULL)//因爲每次修改的是n2的next指向,因此當n2爲空時,n1是頭結點
        {
            n2->next = n1;
            n1 = n2;
            n2 = n3;

            if (n3 != NULL)
            {
                n3 = n3->next;
            }
        }
        return n1;
    }

方法(2):頭插法。讓cur指向當前結點,並且保存cur的下一個節點,創建一個新鏈表的頭指針newnode,每次將cur拿下來頭插,頭插完後將newnode指針始終要做頭,直到cur爲空,即原鏈表結點被插完,此時newnode就是新鏈表的頭。

 ListNode* ReverseList(ListNode* pHead) {
        
        //頭插法
        
       ListNode* cur=pHead;//cur指向第一個節點
       ListNode* newnode=nullptr;
        
       while(cur)
       {
           ListNode* next=cur->next;//保存cur的下一個節點
           cur->next=newnode;//以newnode爲新鏈表頭,將cur拿下來頭插
           newnode=cur;//頭插後,newnode要始終做頭
           cur=next;//移動cur到上一次保存的cur的下一個節點,繼續爲頭插做準備
       }
       return newnode;//當cur爲空時,說明所有節點頭插完了,此時newnode就是新鏈表的的頭
    }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章