實現鏈表翻轉的兩種方法

題目

思路1:藉助棧

利用棧先進後出的特點,將每個節點按順序存入棧中,再從頂到底連接棧中的每個節點
注意倒數第二行代碼 p->next=nullptr!!!要將翻轉後的最後一個節點(即原鏈表的第一個節點)的next置爲nullptr,不然後果可想而知~

    ListNode* reverseList(ListNode* head){
        stack<ListNode*> stk;
        ListNode *reverseHead=new ListNode(0),*p=reverseHead,*tmp;
        while(head){
            stk.push(head);
            head=head->next;
        }
        while(!stk.empty()){
            tmp=stk.top();
            p->next=tmp;
            stk.pop();
            p=p->next;
        }
        p->next=nullptr;
        return reverseHead->next;
    }

思路2:就地操作(推薦)

  1. 逐個斷開原鏈表的每個節點(保存下個節點)
  2. 將斷開的節點連接到反轉鏈表的表頭上
  3. 更新反轉鏈表的表頭
  4. 回到原鏈表的下個節點
    ListNode* reverseList(ListNode* head){
        ListNode* p=nullptr,*tmp;
        while(head){
            tmp=head->next;
            head->next=p;
            p=head;
            head=tmp;
        }
        return p;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章