【程式設計訓練-1】反轉連結串列
阿新 • • 發佈:2021-01-03
技術標籤:程式設計訓練
反轉連結串列這道題不會很難,但今年都是多家公司的面試題,這裡簡單做一下分析和解答。
題目連結:反轉連結串列_牛客網
來看一個示意圖:
p最初的位置在連結串列頭,反轉連結串列的工作,說起來很簡單,就是將上面藍色的箭頭都反一下就可以了,這樣來說,理論上的時間複雜度可以達到線性,也即O(N)。如何反轉?照下面兩步來:
- p初始化為連結串列頭,q置為連結串列頭下一個(如果有的話),連結串列頭的next指標置null
- q的next指標置為p
- p,q同步向前移動
魯棒性也是需要考慮的,如果連結串列為空,也要保證我們的程式碼能工作。
參考程式碼:
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
// 魯棒性檢查
if (pHead == nullptr) {
return nullptr;
}
ListNode* p = pHead;
ListNode* q = nullptr;
if (p->next) {
q = p->next;
}
// 先置連結串列頭的next為空
pHead- >next = nullptr;
// 順序移動p和q,每次均更新指標
// q為null時說明整個連結串列已經遍歷完了
while (q) {
ListNode* tmp = q->next; // 先記錄下q的下個節點
q->next = p;
p = q;
q = tmp;
}
pHead = p;
return pHead;
}
};