快排單連結串列;及乾坤大挪移的分析
今日面試題:
快排(QuickSort)單向連結串列(Singly Linked List)。
乾坤大挪移的分析
題目:
給定一個單向連結串列,設計一個演算法實現連結串列向右旋轉K個位置。K是非負的整數。這題看起來簡單,可真程式設計實現有陷阱囉。
舉例:
給定:1->2->3->4->5->6->null 並且K=3,
則有:4->5->6->1->2->3->null。
分析:
這個題目,看起來是一個相對簡單的題目。很多同學在面試的時候,如果看到這個題目,想必會心花怒放。可是,不要高興得太早,你能夠一次通過麼?bug free?
如果這個題目,不能夠一次性bug free的完成,考官會很失望,結果可能就是可想而知了。因為,在很多大公司的面試中,例如google,amazon等,往往更加看重的是bug free的能力,所以題目不會很難,但要求bug free的,這正好考察基本功和平時是否有嚴格訓練。那要做到bug free就是至關重要的。
回到這個題目,我們簡單說下這個題目的思路。
首先看看一些細節,比如,
- 當K=0時,怎麼辦?
- 當K等於連結串列長度時,怎麼辦?
- 當K大於連結串列長度時,怎麼辦?
除了K=0,顯然,我們需要知道尾指標。那麼,第一步,掃描連結串列得到尾指標tail和連結串列的長度M。如果M=0,完畢。
接下來,計算需要移動的步數得到新的頭指標之前的節點,就是,(K-1) % M,假設指向這個節點的指標為p。
那麼將tail的next指向head,然後將head指向p的next,然後將p的next指向null。
這個解法可能需要掃描連結串列兩次。如果我們事先知道連結串列的長度M的話,也許我們可以用雙指標法:
有兩個指標,第一個指標先走 M-(K % M)-1 步,然後第一個和第二個指標一起走,直到第一個指標指到終點,這個時候:
- 第二個指標所指的next節點設定為新的頭節點
- 將第二個指標所指節點的next指標指向null
- 將第一個指標所指的節點的next指標指向舊的頭節點
下面,我們來看一個變化的類似題,以達到舉一反三。
題目是這樣的,對於有n個元素的陣列 int a[n]={....};寫一個高效演算法將陣列內容迴圈左移m位。比如: int a[6] ={1,2,3,4,5,6} ,迴圈左移3位得到結果{456123}。
演算法的基本思想如下:
還是用面試中的常用技巧,從一個例子出發。假設有一個包含8個數的陣列 int a[8] = {1, 2, 3, 4, 5, 6, 7, 8}; 將其內容迴圈左移3位,即左移後的結果是{4, 5, 6, 7, 8, 1, 2, 3}。
從例子可以看出,將1,2,3移到了陣列的最後,從4開始,直到8都往前移動了3個位置。因此我們可設想將1,2,3看成一個整體先和4, 5, 6交換, 再和7, 8交換。
第一次交換的結果: 4, 5, 6, 1, 2, 3, 7, 8
由於7,8只有兩位,因此第二次交換隻和1,2,3中的1,2進行交換。結果如下: 4, 5, 6, 7, 8, 3, 1, 2。
可以看出,前五位已經滿足了最終結果,只有後3位還不滿足最終結果。但是隻要將3, 1, 2看成一個子陣列,再將這個子陣列迴圈左移1位,即可變成1, 2, 3。
因此在移動元素時可將要左移的m位看成一個整體(如上例中的1, 2, 3),依次和它後面的相同位數的陣列元素交換,如果後面的元素不足m位,假設為t位,t < m,那麼只交換t位,這樣,前面的陣列元素(前 n - m 個元素一定滿足條件)。
最後將後面m個元素看成一個子陣列,再對其進行迴圈左移m - n % m位。
演算法的時間複雜度為O(n),應該少於最基本迴圈演算法的O(mn),空間複雜度為O(1)。
本文來自微信:待字閨中,2013-07-08釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 單連結串列的冒泡,快排,選擇,插入,歸併等多圖詳解
- 連結串列 - 單向連結串列
- 連結串列-單連結串列實現
- 單連結串列
- 單連結串列的建立
- 資料結構-單連結串列、雙連結串列資料結構
- 單向迴圈連結串列大綱
- 簡單的單向連結串列
- 單雙連結串列
- 單連結串列建立連結串列出現問題
- 55-將單連結串列原地逆置(有頭結點的單連結串列)
- 單向連結串列的建立
- 連結串列基礎2(超簡單)--單連結串列的插入和刪除
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 資料結構實驗之連結串列五:單連結串列的拆分資料結構
- 資料結構之連結串列篇(單連結串列的常見操作)資料結構
- 【連結串列問題】刪除單連結串列的中間節點
- 單連結串列成環
- 棧_單向連結串列
- 12.19單向連結串列
- 02-單連結串列的操作
- 單連結串列的排序問題排序
- 單連結串列的逆序輸出 PTA6-1 單連結串列逆轉 為例
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- Python實現單連結串列Python
- 佇列_單向連結串列佇列
- 單向迴圈連結串列
- 單連結串列學習(一)
- 10單向連結串列(slist)
- 【資料結構】連結串列(單連結串列實現+詳解+原碼)資料結構
- 【連結串列問題】打卡3:刪除單連結串列的中間節點
- 結點插入到單連結串列中
- 資料結構之單連結串列資料結構
- 資料結構04——單連結串列資料結構
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- 012 透過連結串列學習Rust之持久化單連結串列Rust持久化
- 012 通過連結串列學習Rust之持久化單連結串列Rust持久化
- 連結串列-迴圈連結串列
- 連結串列-雙向連結串列