一。輸入乙個鍊錶,輸出反轉後的鍊錶。
非遞迴實現:
#上面程式中的while迴圈是主要部分,主體部分**簡單,但不是很好理解,下面用圖示方法,以三個鍊錶節點為例來展示其反轉過程。-*- coding:utf-8 -*-
#class listnode:
#def __init__(self, x):
#self.val = x
#self.next = none
class
solution:
#返回listnode
defreverselist(self, phead):
#write code here
if phead is
none:
return
phead
last = none #
指向上乙個節點
while
phead:
#先用tmp儲存phead的下乙個節點的資訊,
#保證單鏈表不會因為失去phead節點的next而就此斷裂
tmp =phead.next
#儲存完next,就可以讓phead的next指向last了
phead.next =last
#讓last,phead依次向後移動乙個節點,繼續下一次的指標反轉
last =phead
phead =tmp
return last
1. 初始鍊錶狀態
需要定義乙個變數last指向phead的上乙個節點
2. 一次迭代之後
x0先暫時被從鍊錶中脫離出來,由last指向,作為反轉的新鏈,x0反轉之後會是最後乙個節點,因此next指向none,phead則指向原鏈的下乙個節點x1。
3. 兩次迭代之後
x1被脫離出來加入反轉的新鏈,並插入x0之前,phead再後移。
4. 三次迭代之後
反轉完成,phead指向none即結束迴圈,返回last即為新鍊錶的頭結點。
遞迴實現:
#二。給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。-*- coding:utf-8 -*-
#class listnode:
#def __init__(self, x):
#self.val = x
#self.next = none
class
solution:
#返回listnode
defreverselist(self, phead):
#write code here
ifnot phead or
notphead.next:
return
phead
else
: newhead =self.reverselist(phead.next)
phead.next.next=phead
phead.next=none
return newhead
k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。
示例 :
給定這個鍊錶:1->2->3->4->5
當 k = 2 時,應當返回: 2->1->4->3->5
當 k = 3 時,應當返回: 3->2->1->4->5
說明 :
你的演算法只能使用常數的額外空間。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
使用遞迴的方式:
#三。鍊錶兩兩反轉(遞迴實現)definition for singly-linked list.
#class listnode:
#def __init__(self, x):
#self.val = x
#self.next = none
class
solution:
defreversekgroup(self, head, k):
""":type head: listnode
:type k: int
:rtype: listnode
"""current =head
count =0
while current and count!=k:
current =current.next
count += 1
if count ==k:
current =self.reversekgroup(current,k)
while count >0:
temp =head.next
head.next =current
current =head
head =temp
count -= 1head =current
return head
#非遞迴加**class listnode:
#def __init__(self, x):
#self.val = x
#self.next = none
class
solution:
if head == none or head.next ==none:
return
head
l1 =head.next
l1.next =head
return l1
classsolution:
thead = listnode(-1)
thead.next =head
c =thead
while c.next and
c.next.next:
a, b=c.next, c.next.next
c.next, a.next =b, b.next
b.next =a
c =c.next.next
return thead.next
k個一組翻轉鍊錶
題目描述 給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5當 k 2 時,應當返回 2 1 4 3 5當 k 3 時,應當返回 3 2 1...
K 個一組翻轉鍊錶
給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1...
K個一組翻轉鍊錶
難度困難416收藏分享切換為英文關注反饋 給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。示例 給你這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3...