天天看點

【不三不四的腦洞】記錄一次 “街頭搭讪” 之對旋轉連結清單算法的感悟

單身越久越難脫單

前一陣子在網上看到一句話 —— 單身越久越難脫單

作為大齡單身程式猿的我深以為然,甚至覺得單身的時間久了,真的會喪失和異性相處的能力。

以我個人的生活感受(當然不能代表其他所有人單身都是這個原因)來說,惡性循環 主要包含以下點

單身 -> 宅家不愛出門 -> 奶茶甜品不離手,身材走樣 -> 缺乏運動和面對面社交 -> 圈子變小、逐漸社恐 -> 單身

而一旦陷入以上的惡性循環,脫單可不就越來越難了嗎?

【不三不四的腦洞】記錄一次 “街頭搭讪” 之對旋轉連結清單算法的感悟

是以我決定今天下定決心 打破 這個循環,那就先從 身材管理(健身減肥) 開始!

網上有句話說的很好 —— 一個連自己身體都無法掌控的人,如何掌控人生!

一個人的身材,25歲前,是爹媽給的;25歲之後,是自己修的。

能管好自己身材的人,往往能管理好自己的生活和工作。反之,臃腫的身材背後,可能是一團亂糟糟的生活。

肥胖,給工作帶來影響,生活品質也大打折扣,還談什麼奮鬥拼搏呢?

【不三不四的腦洞】記錄一次 “街頭搭讪” 之對旋轉連結清單算法的感悟

下定決心後,立刻用吃奶的力氣做了兩下卧推。。。哎呀媽呀,太累了!

點杯 奶茶 補充補充能量吧~ 有能量才有力氣鍛煉 ~

【不三不四的腦洞】記錄一次 “街頭搭讪” 之對旋轉連結清單算法的感悟

但是畢竟我不是個 沒羞沒臊 的人,因為喝了奶茶,心裡還是有一丢丢 愧疚感 的,是以打算出門溜達溜達。順便緩解一下自己社恐的症狀,暫時脫離虛拟的二次元生活,嘗試融入一下現實社會。當我正在街上漫不經心的向前走着時,突然迎面走來一個妹子,朱唇玉面,頭發梳個丸子頭,身穿碎花裙子,曼妙身材呼之欲出。

【不三不四的腦洞】記錄一次 “街頭搭讪” 之對旋轉連結清單算法的感悟

我遠遠看去,感覺妹子仿佛在和我微笑,但是當妹子越走越近,社恐又羞澀的我沒敢和她對視,而是選擇低頭默默地繼續往前走。但是走着走着,腦中一個聲音狠狠地訓斥我:“ShaderJoy,你出門不就是為了打破惡性循環的嗎?既然上天都給你安排了這樣的一個千載難逢的機會,你都不選擇把握,你都這麼大年齡了,還怕個什麼雞毛?就算被拒絕身上能掉塊肉嗎?”

言之有理啊!這個心靈的聲音

【不三不四的腦洞】記錄一次 “街頭搭讪” 之對旋轉連結清單算法的感悟

我重新鼓起了勇氣,稍稍加快了腳步往回走尋覓妹子的蹤影。可是走了一會,卻再沒看到妹子的身影,我頓時感到有些失望,後悔當時自己沒有好好把握機會,果然世上沒有後悔藥。。。

【不三不四的腦洞】記錄一次 “街頭搭讪” 之對旋轉連結清單算法的感悟

正在我内心懊惱的時候,好巧不巧的,妹子居然出現在我前方不遠處,原來她也在往回走!難道她也是來找我的嗎?!天呐,難道我這個大齡單身猿今天終于要逆天走 “狗屎運” 。。。啊呸,“桃花運” 了嘛!~

我整理了一下衣服,當妹子走到我跟前的時候,我仿佛看見了她又微微沖我一笑,此時我決心一定要把握住這次機會上前和她搭讪了,剛說:“你好……”。

誰知 “好” 字還沒說出口,妹子就驚恐地 “咻” 得一下以光速 “彈開” 了,臉上還滿是嫌棄的表情,躲得遠遠的,然後迅速消失,留我一人尬在原地,原來上面的那一切都是我的幻覺。。。她壓根沒有對我微笑,哪有什麼狗血純愛偶像劇的上天安排。。。

【不三不四的腦洞】記錄一次 “街頭搭讪” 之對旋轉連結清單算法的感悟

随着我這次的搭讪失敗,我又回到了上面的 “惡性循環” 圈子裡。。。

【不三不四的腦洞】記錄一次 “街頭搭讪” 之對旋轉連結清單算法的感悟

算法感悟

不過沒關系,我又通過這次慘痛的失敗,悟出了關于算法的道理 —— 我所身處的 惡性循環 不就很類似

LeetCode 61 Rotate List (旋轉連結清單) 嘛,命運之輪一直在周而複始的循環旋轉。。。

好了,為了簡單起見舉個例子,原連結清單如下,

即 ​

​l = 5​

1->2->3->4->5->nullptr

​k = 2​

​ 的情況下

4->5->1->2->3->nullptr
///@note 代碼原作者: Huahua
///      詳細注釋:ShaderJoy
class Solution {
public:
  ListNode* rotateRight(ListNode* head, int k) {
    if (!head) return head;    
    int l = 1;                                     ///< 記錄連結清單的長度,預設為 1
    ListNode* tail = head;                         ///< 尾指針,初始化指向連結清單頭部
    while (tail->next) { tail = tail->next; ++l; } ///< 周遊連結清單,記錄連結清單的長度,同時尾指針指向連結清單尾部
    k %= l; ///< 由于是循環連結清單,是以需要排除結果重複的步數,得到實際的旋轉次數
    
    if (k == 0) return head; ///< 無需循環
    
    /// @note ★
    ListNode* prev = head;             ///< 作用:指向要操作結點的前一個結點。初始為連結清單頭部
    while (--l > k) prev = prev->next; ///< prev 向後移動 l-k-1 步            【例子中的 3】
    ListNode* new_head = prev->next;   ///< 然後儲存 prev 後面的結點作為新頭 【例子中的 3 所指的下一個,是 4】
    tail->next = head;                 ///< 将舊頭連結到連結清單尾部             【例子中的 1】
    prev->next = nullptr;              ///< 處理新尾部                       【例子中的 3 所指的下一個,斷開 4】
    return new_head;
  }
};      

其中為了加深記憶,再次将 關鍵步驟 ★ 總結如下

  1. 将​

    ​prev​

    ​ 移動到待操作(新頭)結點的前一個結點;
  2. 儲存待操作結點為​

    ​new_head​

    ​;
  3. 将​

    ​head​

    ​ 連結到連結清單尾端;
  4. 斷開​

    ​prev​

    ​ 和原先其下一個(即新頭)結點的連結

結尾