雙指標迭代
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.單層遞迴邏輯
和上一種方法的思想一致
classsolution
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、接回到原來的鍊錶中
classsolution:
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、將上述兩個過程的結果連線起來
就是反轉完後的鍊錶的尾結點連上下一次遞迴完後的新頭節點
反轉完後的鍊錶的尾結點是原鍊錶的頭結點
classsolution:
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...