K 个一组翻转链表
最近刷leetcode和做字节跳动遇到K 个一组翻转链表问题。
整体思路分为两个任务,首先是将整个链表分成K段,
- 段内进行重新排序
- 段间进行重新链接
为了让代码实现上述过程的循环,需要得到每段前后的结点信息。(关键)
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
class Solution(object):
def reverseK(self,head,tail):
after = tail.next
pre = head
while after != tail:
temp = pre.next
pre.next = after
after = pre
pre =temp
return tail,head
def reverseKGroup(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
sky = ListNode(0)
sky.next = head
pre = sky
while head != None:
tail = pre
for i in range(k):
tail = tail.next
if not tail:
return sky.next
nex = tail.next
head,tail = self.reverseK(head,tail)
pre.next = head
tail.next = nex
pre = tail
head = tail.next
return sky.next
总结:难点在于每段连接时构造清楚上一段的尾部结点指针和下一段的头部结点。
reference
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/添加链接描述