题目描述

给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

解题思路
题目要求不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换,因此,将链表的节点值存储下来,然后根据节点值创建节点。
1、遍历链表,并将链表节点的值使用数组进行存储:

l = []
while head:
	l.append(head.val)
	head = head.next

2、对保存节点值的数组按照k个一组进行翻转:

		t = []
        i = 0
        while i < len(l) and (len(l) -i) >= k:
            t += l[k + i - 1: i: -1]
            t.append(l[i])
            i += k
        if len(t) < len(l):
            t += l[i: len(l)]

3、使用翻转后的数组创建链表:

h = ListNode(t[0])
        h_copy = h
        for j in range(1, len(t), 1):
            temp = ListNode(t[j])
            h.next = temp
            h = h.next

完整代码

# 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:
        l = []
        if not head:
            return None
        while head:
            l.append(head.val)
            head = head.next
        t = []
        i = 0
        while i < len(l) and (len(l) -i) >= k:
            t += l[k + i - 1: i: -1]
            t.append(l[i])
            i += k
        if len(t) < len(l):
            t += l[i: len(l)]
        h = ListNode(t[0])
        h_copy = h
        for j in range(1, len(t), 1):
            temp = ListNode(t[j])
            h.next = temp
            h = h.next
        return h_copy