1.反轉單鏈表
2.二叉樹中序遍歷非遞迴
3.合併兩個字典
4.最長的01個數相等的連串
5.長度為2n的陣列,劃分為相等兩部分,使其之和的差的絕對值最小
反轉單鏈表 遞迴與非遞迴方式:
非遞迴方式 非遞迴從第乙個節點開始翻轉鍊錶
可以採用雙指標與三指標來實現
三指標: ppre pcur pnext 分別為當前指標的前乙個節點 當前節點 當前節點後乙個節點
pcur指向head ppre=null 首先計算pnext = pcur.next 若pnext==null,則說明當前pcur為最後乙個節點,令pcur.next = ppre直接返回即可,否則需要pcur.next = ppre 並且移動ppre = pcur pcur = pnext, 進行下乙個節點的迭代
def reverselist(head):
if head == none:
return
pcur = head
ppre = none
preversehead = none
while pcur != none:
pnext = pcur.next
if pnext == none:
preversehead = pcur
pcur.next = ppre
return preversehead
else:
pcur.next = ppre
ppre = pcur
pcur = pnext
return preversehead
看一下大神的雙指標思路:
乙個指標p來遍歷鍊錶 乙個指標newh來指向翻轉鍊錶的頭結點 這裡
首先需要乙個臨時指標來記錄p的下乙個節點tmp = p.next
然後將p.next指向newh p.next = newh
將newh移動到p位置 newh = p
更新p位置 p = tmp
def reverselist3(head):
if head == none:
return
reversehead = none
p = head
while p != none:
tmp = p.next
p.next = reversehead
reversehead = p
p = tmp
return reversehead
遞迴方式: 從最後乙個節點開始翻轉鍊錶
當遞迴到尾指標時,head.next==null 直接返回head即可;如果head.next非空,則需要遞迴呼叫繼續翻轉鍊錶,需要將head的下乙個節點指向head,並且斷開head.next.
單鏈表翻轉
關於單鏈表的翻轉問題頗為困擾人。下面寫的程式只需遍歷每個節點一次,並且不需要構造輔助接點 通過new的方式 另外這個問題可以轉換為乙個迴圈鍊錶結構,很有意思。h struct node class cdatastruct cpp檔案 cdatastruct cdatastruct void cdat...
單鏈表翻轉
1,原理 使用p和q兩個指標配合工作,使得兩個節點間的指向反向,同時用r記錄剩下的鍊錶。p head q head next head next null 現在進入迴圈體,這是第一次迴圈。r q next q next p p q q r 第二次迴圈。r q next q next p p q q ...
單鏈表翻轉
相比之前的那個方法 206.reverse linked list 這個方法比較簡單,直接在鍊錶上面進行逆序 容易理解 此 是用於將帶頭結點的單鏈表進行逆序,思路 1.首先設p結點為第乙個有效結點 即頭結點的下乙個節點 q為p的下乙個節點,原因從後面可知。2.將所給節點從頭結點處斷開,然後讓p結點的...