翻轉鍊錶和k個一組翻轉以及兩兩反轉

2022-09-01 22:09:26 字數 3292 閱讀 1877

一。輸入乙個鍊錶,輸出反轉後的鍊錶。 

非遞迴實現:

#

-*- 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

上面程式中的while迴圈是主要部分,主體部分**簡單,但不是很好理解,下面用圖示方法,以三個鍊錶節點為例來展示其反轉過程。

1. 初始鍊錶狀態 

需要定義乙個變數last指向phead的上乙個節點

2. 一次迭代之後 

x0先暫時被從鍊錶中脫離出來,由last指向,作為反轉的新鏈,x0反轉之後會是最後乙個節點,因此next指向none,phead則指向原鏈的下乙個節點x1。

3. 兩次迭代之後 

x1被脫離出來加入反轉的新鏈,並插入x0之前,phead再後移。

4. 三次迭代之後 

反轉完成,phead指向none即結束迴圈,返回last即為新鍊錶的頭結點。

遞迴實現:

#

-*- 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 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 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

非遞迴加**

class

solution:

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...