题目
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
Example:
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
Note:
Only constant extra memory is allowed.
You may not alter the values in the list’s nodes, only nodes itself may be changed.
递归
题目要求将小于链表长度的k个链表进行反转,不足k个的链表顺序不变。这题乍看起来很复杂,其实可以先翻转第一组k个链表,然后将剩余的部分看作一个新的链表进行递归计算。
python 代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
if not head:
return None
a = b = head
for i in range(k):
if not b:
return head
b = b.next
newHead = self.reverse(a,b)
a.next = self.reverseKGroup(b,k)
return newHead
def reverse(self,a,b):
pre = None
cur = a
nxt = a
while cur != b:
nxt = cur.next
cur.next = pre
pre = cur
cur = nxt
return pre