题目
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
思路
- 将整个链表分为待:翻转的前驱,待翻转的链表,待翻转的后继;
- 用循环定位待翻转链表的前驱节点和后继节点。
代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverse(self, head):
if not head:
return head
aim = ListNode(0)
aim.next = head
pre = head
head = head.next
while(head):
next = head.next
head.next = aim.next
aim.next = head
pre.next = next
head = pre.next
return aim.next
def reverseKGroup(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if not head:
return head
aim = ListNode(0)
aim.next = head
pre = aim
end = aim
while(end.next):
for i in range(k):
end = end.next
if not end:
return aim.next
next = end.next
start = pre.next
# 这一步很重要,不然链表会乱掉
end.next = None
pre.next = self.reverse(start)
start.next = next
pre = start
end = start
return aim.next