給你乙個鍊錶,每 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(object):
# def __init__(self, x):
# self.val = x
# self.next = none
class solution(object):
def reversekgroup(self, head, k):
""":type head: listnode
:type k: int
:rtype: listnode
"""dummy = point = listnode(0)
while true:
temp = head
count = k
stack =
while count and temp:
temp = temp.next
count -= 1
if count:
point.next = head
break
while stack:
point.next = stack.pop()
point = point.next
point.next = temp
head = temp
return dummy.next
每次放進去k個到stack裡面,然後取出來,取都選最上面的,所以這樣訪問的時候就正好達到了題目要求的效果。
按照道理來說這樣來說,應該就可以沒事啦,可以我看到一位大神的遞迴法當時就研究起來了,真的是只可意會不可言傳,估計要積攢很多解題的經驗才能有這樣的思路吧,好在緊忙看了半天搞懂了其中的思路,而且時間比上面的用棧的要快
一些值得注意的地方我也注釋了,解題嘛,用不同的方法去解決挺有成就感的,就像題目以各種方式去讓你失敗一樣,自己用多種方式去通過題目的測試很好玩。
# definition for singly-linked list.
# class listnode(object):
# def __init__(self, x):
# self.val = x
# self.next = none
class solution(object):
def reversekgroup(self, head, k):
cur = head # head是k個節點的第乙個
count = 0
while cur and count < k:
cur = cur.next
count += 1
if count == k:
cur = self.reversekgroup(cur, k) # 迴圈到最後不足k的節點(即次節點之後就是剩餘節點)
while count:
temp = head.next # 臨時存放head.next
head.next = cur
cur = head
head = temp #下乙個
count -= 1
head = cur
return head
LeetCode刷題 k個一組翻轉鍊錶
給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1 4 5 你...
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...