演算法16 單鏈表翻轉

2021-08-31 09:48:24 字數 2403 閱讀 9985

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結點的...