25. Reverse Nodes in k-Group
花了很大的精力才做出来,不过也算是亲手做出来了,在这里再分析一下
基本的想法就是一段一段来,所以创建了一个函数reverseK, 但是reverseK的时候要返回多个值,一个是翻转后这一段的head和tail,还要返回下一段的head。比较tricky的地方就是,这中间还需要用一个prev把一段一段连起来。最好不要放在reverseK这个函数里连,感觉会造成比较大的麻烦,这样做比较清爽一点。
# 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
"""
if k == 1:
return head
dummyhead = ListNode(0)
dummyhead.next = head
l = self.length(head)
m = 0
next_head = head
prev = dummyhead
while m + k <= l:
cur_head, next_head, cur_tail = self.reverseK(next_head, k)
prev.next = cur_head
prev = cur_tail
m += k
prev.next = next_head
return dummyhead.next
def reverseK(self, head, m):
tail = head
prev = None
while m > 0 and head:
next = head.next
head.next = prev
prev = head
head = next
m -= 1
return prev, head, tail # prev is reversed linkedlist head, head is the next first element for next part
def length(self, head):
count = 0
while head:
count += 1
head = head.next
return count