LeetCode 25 K 個一組翻轉鍊錶

2022-06-17 23:03:10 字數 3059 閱讀 6241

題目

給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。

k 是乙個正整數,它的值小於或等於鍊錶的長度。

如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。

示例:

給你這個鍊錶:1->2->3->4->5

當 k = 2 時,應當返回: 2->1->4->3->5

當 k = 3 時,應當返回: 3->2->1->4->5

說明:

你的演算法只能使用常數的額外空間。

你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。

思路

這個題目和上個題目很像,不過,這裡是定義變數交換,並且不夠k次保持原有順序。

這裡記錄下powcai大大的題解,思路和**都比自己清晰太多了,sad~~

繼續取經學習ang...

方法一:

用棧,我們把 k 個數壓入棧中,然後彈出來的順序就是翻轉的!

這裡要注意幾個問題:

class solution(object):

def reversekgroup(self, head, k):

""":type head: listnode

:type k: int

:rtype: listnode

"""dummy = listnode(0)

p = dummy

while true:

count = k

stack =

tmp = head

while count and tmp:

tmp = tmp.next

count -= 1

# 注意,目前tmp所在k+1位置

# 說明剩下的鍊錶不夠k個,跳出迴圈

if count :

p.next = head

break

# 翻轉操作

while stack:

p.next = stack.pop()

p = p.next

#與剩下鍊錶連線起來

p.next = tmp

head = tmp

return dummy.next

方法二:

尾插法。

直接舉個例子:k = 3

pre

tail head

dummy 1 2 3 4 5

# 我們用tail 移到要翻轉的部分最後乙個元素

pre head tail

dummy 1 2 3 4 5

cur# 我們尾插法的意思就是,依次把cur移到tail後面

pre tail head

dummy 2 3 1 4 5

cur# 依次類推

pre tail head

dummy 3 2 1 4 5

cur....

class solution(object):

def reversekgroup(self, head, k):

""":type head: listnode

:type k: int

:rtype: listnode

"""dummy = listnode(0)

dummy.next = head

pre = dummy

tail = dummy

while true:

count = k

while count and tail:

count -= 1

tail = tail.next

if not tail: break

head = pre.next

while pre.next != tail:

cur = pre.next # 獲取下乙個元素

# pre與cur.next連線起來,此時cur(孤單)掉了出來

pre.next = cur.next

cur.next = tail.next # 和剩餘的鍊錶連線起來

tail.next = cur #插在tail後面

# 改變 pre tail 的值

pre = head

tail = head

return dummy.next

方法三:

遞迴。

class solution(object):

def reversekgroup(self, head, k):

""":type head: listnode

:type k: int

:rtype: listnode

"""cur = head

count = 0

while cur and count!= k:

cur = cur.next

count += 1

if count == k:

cur = self.reversekgroup(cur, k)

while count:

tmp = head.next

head.next = cur

cur = head

head = tmp

count -= 1

head = cur

return head

note:

刷到25題了,這25應該已經囊括了幾乎大部分演算法的處理思想,現在開始複習這些題目,等真正刷到熟練的時候再繼續往下刷。

o。o

LeetCode 25 k個一組翻轉鍊錶

給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1 4 5 這...

LeetCode 25 K個一組翻轉鍊錶

按照每k個為一組,記錄這組內的頭和尾,第一組只需記錄翻轉後的尾即tail 接下來的每一組記錄翻轉後頭 nhead 和尾 ntail.注意更新的順序 class solution length k if length 0 return head p head listnode otail head l...

leetcode 25 k個一組翻轉鍊錶

題目描述 給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2...