給出一個鏈表,每 k 個節(jié)點一組進行翻轉,并返回翻轉后的鏈表。
k 是一個正整數,它的值小于或等于鏈表的長度。如果節(jié)點總數不是 k 的整數倍,那么將最后剩余節(jié)點保持原有順序。
示例 :
給定這個鏈表:1->2->3->4->5
當 k = 2 時,應當返回: 2->1->4->3->5
當 k = 3 時,應當返回: 3->2->1->4->5
說明 :
你的算法只能使用常數的額外空間。
你不能只是單純的改變節(jié)點內部的值,而是需要實際的進行節(jié)點交換。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverse(self, head, k):
p = head
for i in range(k): # 先檢驗夠不夠數
p = p.next
if p is None:
return None
p = head.next.next
last = head.next
for i in range(k - 1): # 翻轉
last.next = p.next
p.next = head.next
head.next = p
p = last.next
return last
def reverseKGroup(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if k < 2:
return head
dummy = ListNode(0)
dummy.next = head
p = dummy
while p is not None:
p = self.reverse(p, k)
return last.next
翻轉
翻轉的思想是,把p一個挨一個的拎到head后面
比如1 2 3 4 5,k = 3 加上dummy為 0 1 2 3 4 5
第1趟循環(huán): 0 1 2 3 4 5
head --> 0, last --> 1,p --> 2
把2拎到0的后面,變成0 2 1 3 4 5
第2趟循環(huán):0 2 1 3 4 5
head --> 0, last --> 1,p --> 3
把3拎到0的后面,變成0 3 2 1 4 5
第3趟循環(huán):0 3 2 1 4 5
head --> 0, last --> 1,p --> 4
把4拎到0的后面,變成0 4 3 2 1 5
循環(huán)了k-1次即3次,循環(huán)退出
最后得 4 3 2 1 5