問題描述
輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。
舉個栗子:
輸入鏈表: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;
}
};
我的總結
反轉鏈表是基本操作,需要熟練掌握。