LinkedList總結


title: LinkedList系列
comments: true
date: 2017-07-10 23:46:55
updated: 2017-07-17 09:46:55
categories: Leetcode
tags: [LinkedList, TwoPointer]


LinkedList系列總結

24/27
[x] Easy
[x] Medium
[x] Hard
這種題,多畫圖,一步步來,確定哪個node指向哪個node就會好一點,之后把圖放上來,會更容易復習!

基礎

dummyNode

適用于頭節點需要進行操作,增刪改,亦或者保存頭節點,不被后續操作改變

dummy = ListNode(0)
dummy.next = head
curr = head

reverseList

Iterative版本,簡要來說就是記錄下一節點,當前節點指向上一節點,同步移動上一節點和當前節點。最后的curr為空,prev為頭也就是最初鏈表的最后一個元素

prev = None
curr = head
while curr:
    nextNode = curr.next
    curr.next = prev
    prev = curr
    curr = nextNode
return prev

Recursive版本的,一直到底,然后倒敘指針

second = head.next
head.next = None
rest = self.reverseList(second)
second.next = head
return rest

變種1 92. Reverse Linked List II
除了移動節點之外,關鍵是鏈接頭和尾

pre.next.next = curr //pre.next 為最初的頭,.next則鏈接后來的尾和最初的尾 1-2-3-4-5,1-4-3-2-5,2-5
pre.next = newHead // 1-4

快慢指針

用于檢測環和找中點,見于

  1. Linked List Cycle
  2. Linked List Cycle II
    ·234. Palindrome Linked List
fast, slow = head, head
while fast and fast.next:
    fast = fast.next.next
    slow = slow.next

Medium版本

·369. Plus One Linked List
·445. Add Two Numbers II
本質上用stack保存節點信息,然后不斷在前方添加節點

node.val = add_value % 10
carry = ListNode(add_value / 10)
carry.next = node
node = carry
add_value /= 10

Merge,Move系列
·21. Merge Two Sorted Lists
·328. Odd Even Linked List
·86. Partition List

curr = dummy
while l1 and l2:
    if l1.val < l2.val:
        curr.next = l1
        l1 = l1.next
    else:
        curr.next = l2
        l2 = l2.next
    curr = curr.next

保證兩個list都存在,然后剩余的append在后面;然后移動節點的過程中要數好步伐while even and even.next:
·160. Intersection of Two Linked Lists
·19. Remove Nth Node From End of List

`61. Rotate List
trick的地方是找到最后一個node,并且鏈接第一個,使用常用模版,不過稍加改動,因為要找到最后一個node而不是長度,所以要提前終止循環

length = 1
while curr.next:
    curr = curr.next
    length += 1
curr.next = head
move = length-1-k%length

綜合
`143. Reorder List
結合 以上多種方法,快慢指針找中點,反轉,merge

mid = self.findMiddle(head)
tail = self.reverse(mid.next)
mid.next = None

self.merge(head, tail)

`23. Merge k Sorted Lists
一種方法是利用merge two list然后不斷divide and conquer,另外一種比較簡潔的是利用PriorityQueue,然后不斷put和poll()進而每一個node都是所有優先隊列中最小的一個

q = PriorityQueue()
for node in lists:
    if node: ## empty
        q.put((node.val, node))
while q.qsize():
    curr.next = q.get()[1]
    curr = curr.next
    if curr.next:
        q.put((curr.next.val, curr.next))

`82. Remove Duplicates from Sorted List II
因為要移除所有重復的node,所以勢必要prev保存上一節點,然后如果中間因為重復節點而curr!= prev.next,要把prev節點的next放到curr的next節點,因為curr為重復節點的最后一個

while curr:
    while curr.next and curr.val == curr.next.val: ## [1]
        curr = curr.next
        if prev.next != curr:
            prev.next = curr.next
            curr = prev.next
        else:
            prev = prev.next
            curr = curr.next

`109. Convert Sorted List to Binary Search Tree
用helperfunction幫助,每一步找出子鏈表的中點,然后分別遞歸left和right節點。

while fast!= tail and fast.next != tail:
    fast = fast.next.next
    slow = slow.next
root = TreeNode(slow.val)
root.left = self.helper(head, slow)
root.right = self.helper(slow.next, tail)

·148. Sort List
分治法,然后分別對子鏈表merge

prev,fast, slow =  None, head, head
while fast and fast.next:
    prev = slow
    slow = slow.next
    fast = fast.next.next
    
prev.next = None ## cut the middle
    
l1 = self.sortList(head)
l2 = self.sortList(slow)
    
return self.merge(l1, l2)

·24. Swap Nodes in Pairs
這道題勤畫圖,一步步來就好,iterative的方法比較煩,不過是Reverse Nodes in k-Group的簡化版,那道題是LinkedList集大成者

while curr.next and curr.next.next:
    first = curr.next   # 1
    second = curr.next.next #2
    
    first.next = second.next # 1-3
    curr.next = second  #-2
    curr.next.next = first  #2-1
    curr = curr.next.next # 1

`25. Reverse Nodes in k-Group
這道題是一道典型的綜合題,適合復習備考多刷。它的子function是reverseList的改良,因為需要保存頭節點和尾節點,所以需要設置lastNode和nextNode,然后與之相對應的就是lastNode不斷和后面的節點進行調換。可以看看對比

/*
 * 0->1->2->3->4->5->6
 * |           |   
 * pre        next
 *
 * after calling pre = reverse(pre, next)
 * 
 * 0->3->2->1->4->5->6
 *          |  |
 *          pre next 
 */
 
def reverseNode(self, pre, nextNode):
    lastNode = pre.next
    curr = lastNode.next
    
    while curr != nextNode:
        lastNode.next = curr.next
        curr.next = pre.next
        pre.next = curr
        curr = lastNode.next
    return lastNode
    
def reverseList(self, head):
    if not head or not head.next:
        return head
    prev = None
    curr = head
    while curr:
        nextNode = curr.next
        curr.next = prev
        prev = curr
        curr = nextNode
    return prev
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容