力扣206題 92題 25題(反轉鍊錶)

2022-06-21 03:42:13 字數 3039 閱讀 4987

雙指標迭代

1、申請兩個指標,乙個叫pre,乙個叫cur

cur代表的是當前節點,pre是cur的前乙個節點

剛開始,pre指向null,cur是第乙個節點

然後cur和pre共同往後走,

cur每走完一步就要指向pre

cur變成none了,就迭代完了

2、cur如何往後走

tmp記錄cur當前節點的下乙個節點

tmp = cur.next

cur = tmp

/**

* definition for singly-linked list.

* public class listnode

* listnode(int val)

* listnode(int val, listnode next)

* } */

class

solution

return

prev;

}}

1.遞迴引數以及返回值

遞迴引數:前後指標

返回值:新鍊錶的頭結點

2.確認終止條件:

cur指標(走的快的指標)指向null,遞迴終止

3.單層遞迴邏輯

和上一種方法的思想一致

class

solution

private

listnode reverse(listnode prev, listnode cur)

listnode temp = null

;

temp =cur.next;

cur.next =prev;

//prev =cur;

//cur =temp;

return

reverse(cur, temp);

}}

將需要反轉的的地方先反轉,

然後與原來的鍊錶拼接起來

left是需要反轉的地方的第乙個節點

right是最後乙個

1、將pre放到left的前面乙個節點

2、將curr放到right後面乙個節點

3、切斷連線

4、將子鍊錶反轉,用單調的方式

5、接回到原來的鍊錶中

class

solution:

def reversebetween(self, head: listnode, left: int, right: int) ->listnode:

defreverse_linked_list(head: listnode):

#也可以使用遞迴反轉乙個鍊錶

pre =none

cur =head

while

cur:

next =cur.next

cur.next =pre

pre =cur

cur =next

#因為頭節點有可能發生變化,使用虛擬頭節點可以避免複雜的分類討論

dummy_node = listnode(-1)

dummy_node.next =head

pre =dummy_node

#第 1 步:從虛擬頭節點走 left - 1 步,來到 left 節點的前乙個節點

#建議寫在 for 迴圈裡,語義清晰

for _ in range(left - 1):

pre =pre.next

#第 2 步:從 pre 再走 right - left + 1 步,來到 right 節點

right_node =pre

for _ in range(right - left + 1):

right_node =right_node.next

#第 3 步:切斷出乙個子鍊錶(擷取鍊錶)

left_node =pre.next

curr =right_node.next

# pre.next =none

right_node.next =none

#第 4 步:同第 206 題,反轉鍊錶的子區間

reverse_linked_list(left_node)

#第 5 步:接回到原來的鍊錶中

pre.next =right_node

left_node.next =curr

return dummy_node.next

遞迴思想

遞迴+迭代

1、遞迴:把前k個節點反轉,後面的節點也是一條鍊錶,

而且規模比原來鍊錶小,就是子問題

子問題與原問題的結構相同

2、迭代:同206題反轉鍊錶

1、先反轉以head開頭的k個元素

2、將第k+1個元素作為head再遞迴呼叫

3、將上述兩個過程的結果連線起來

就是反轉完後的鍊錶的尾結點連上下一次遞迴完後的新頭節點

反轉完後的鍊錶的尾結點是原鍊錶的頭結點

class

solution:

def reversekgroup(self, head: listnode, k: int) ->listnode:

if head is

none:

return

none

a = b =head

for _ in

range(k):

if b is

none:

return

head

b =b.next

defreverse(a,b):

pre =none

cur =a

next =a

while cur !=b:

next =cur.next

cur.next =pre

pre =cur

cur =next

return

pre newhead =reverse(a,b)

a.next =self.reversekgroup(b,k)

return newhead

力扣網刷題筆記 第206題 反轉鍊錶

題目 反轉乙個鍊錶 例項 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 分析 第一步 將上一結點present指向null,current指向首元結點,next指向正向鍊錶的下乙個結點。第二步 先將當前結點current指向上一結點present,然後將當前結點賦值給上一節...

每日一題力扣206

反轉乙個單鏈表。class solution def reverselist self,head listnode listnode if head is none or head.next is none return head pre 就是那個空鍊錶 pre,cur none,head 不斷將當...

每日一題力扣92

反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。class solution def reversebetween self,head listnode,m int,n int listnode if m n return head dummy listnode 1 dummy.next h...