难度:困难
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
- 你的算法只能使用常数的额外空间。(未做到。。。)
- 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
思路:本题是在24题基础上...进行修改的,把原来的交换更换为循环交换即可,不过本题未做到空间复杂度要求,如果要达到空间复杂度要求,提供一个思路:遍历链表,遍历过程中判断该结点是否是可交换结点的前结点(例如1:5交换,认为1是前结点),然后此时用新指针找到后结点并交换即可,当遇到后结点为空时,说明最后一部分k不满足k个,此时返回链表即可。
代码如下(不满足空间):
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseKGroup(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
#判空
if head is None:
return head
#将结点转化为数组
list1=[]
while(head):
list1.append(head.val)
head=head.next
flag=1
#两两交换数组
for i in range(len(list1)/k):
#判断是否时最后结点,且不满足k
if i==len(list1)/k and len(list1)%k!=0:
break
else:
#循环交换满足k的数组
for j in range(k/2):
x=list1[i*k+k-j-1]
list1[i*k+k-j-1]=list1[i*k+j]
list1[i*k+j]=x
#创造新的带头结点指针,用于数组转链表
List2=ListNode(-1)
List3=List2
for i in range(len(list1)):
List2.next=ListNode(list1[i])
List2=List2.next
return List3.next