反轉鏈表[C++版]

問題描述

輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。
舉個栗子:
輸入鏈表:1->2->3->6->9
反轉鏈表:9->6->3->2->1
輸出:新鏈表的表頭

解決思路

考慮到鏈表的性質,由若干節點鏈接起來組成的鏈表。
我們的鏈表p1可以寫成:
1->2->3->6->9->nullptr
反轉列表p2結果爲:
9->6->3->2->1->nullptr
我們可以用依次插入的方式進行鏈表反轉,控制每個節點的指針是關鍵吧。
我們可以訪問原鏈表的表頭,並令其指向nullptr,這一步操作的結果爲:
p1:2->3->6->9->nullptr
p2:1->nullptr
這也是p2當前的組成。
我們令p1 = p1->next,這樣一來,就相當於"拋棄"了p1的表頭,然後再次訪問p1的表頭,並令其指向p2,這一步的結果爲:
p1:3->6->9->nullptr
p2:2->1->nullptr
這也是p2當前的組成。
我們令p1 = p1->next,繼續拋棄一個表頭,再次訪問新p1的表頭,並令其指向p2,這一步的結果爲:
p1:6->9->nullptr
p2:3->2->1->nullptr
繼續上述操作,直到最後:
p1:空
p2:9->6->3->2->1->nullptr

我的代碼

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};
class Solution {
public:
    ListNode* ReverseList(ListNode* p1) {
    	// p2爲反轉鏈表,初始化爲nullptr
        ListNode* p2 = nullptr;
        // pNext爲每次拋棄表頭的p1指針
        ListNode* pNext = nullptr;
        // 當p1指針不爲空時
        while(p1){
        	// pNext保存拋棄表頭的p1指針
            pNext = p1->next;
            // 構建現階段的p2
            p1->next = p2;
            // 保存下來
            p2 = p1;
            // p1 更新爲拋棄表頭的p1
            p1 = pNext;
        }
        return node;
    }
};

我的總結

反轉鏈表是基本操作,需要熟練掌握。

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