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