1. 程式人生 > 其它 >【程式設計訓練-1】反轉連結串列

【程式設計訓練-1】反轉連結串列

技術標籤:程式設計訓練

反轉連結串列這道題不會很難,但今年都是多家公司的面試題,這裡簡單做一下分析和解答。
題目連結:反轉連結串列_牛客網

來看一個示意圖:
在這裡插入圖片描述
p最初的位置在連結串列頭,反轉連結串列的工作,說起來很簡單,就是將上面藍色的箭頭都反一下就可以了,這樣來說,理論上的時間複雜度可以達到線性,也即O(N)。如何反轉?照下面兩步來:

  1. p初始化為連結串列頭,q置為連結串列頭下一個(如果有的話),連結串列頭的next指標置null
  2. q的next指標置為p
  3. 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; } };