leetcode 每日一题 25. K 个一组翻转链表

递归法

思路:

根据题意先判断节点数是否小于k,如果小于k,直接返回head。接着可以先从head起取k个节点进行翻转,然后对翻转后的链表尾部后面的节点进行递归调用。最后我们要考虑的是如何对k个节点进行翻转,可以采用迭代的方式两两(链表和新节点)翻转实现k个节点的翻转。

例如:

1 -> 2 -> 3 -> 4

① 对象1:  1   对象2: 2    翻转后:  2->1

② 对象1: 2->1  对象2: 3  翻转后:  3->2->1

③ 对象1: 3->2->1  对象2: 4  翻转后: 4->3->2->1

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        if not head:
            return
        temp = head
        for i in range(k-1):
            if temp.next:
                temp = temp.next
            else:
                return head 
        end = head
        for j in range(k-1):
            if end.next:
                head,end = self.reverseTwo(head,end,end.next)
        end.next = self.reverseKGroup(end.next,k)
        return head
    def reverseTwo(self,l1Begin:ListNode,l1End:ListNode,l2:ListNode)-> (ListNode,ListNode):
        l1End.next = l2.next
        l2.next = l1Begin
        return l2,l1End

 

posted @ 2020-05-07 13:29  nil_f  阅读(117)  评论(0编辑  收藏  举报