题目:
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.
You may not alter the values in the nodes, only nodes itself may be changed.
Only constant memory is allowed.
For 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
算法思想:
考虑到链表适合插入删除,但不适合访问第i个元素值,而该问题中需要频繁访问第i个元素值,因此将链表元素值拷贝到一个数组中,然后遍历链表,寻找链表第j个位置应该存放对应数组中第ind个值,其对应关系如下:
ind=m//k*k+k-m%k-1 其中//表示整除取商
Python实现如下:
# -*- coding:utf-8 -*-
'''
Created on 2017年5月5日
@author: ZhuangLiang
'''
# 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
"""
d=head
p=head
arr=[]
i=0
while d!=None:
arr.append(d.val)
i=i+1
d=d.next
m=0;
while p!=None and m//k<i//k:
ind=m//k*k+k-m%k-1
p.val=arr[ind]
p=p.next
m=m+1
return head
if __name__ == '__main__':
list=None
p=list
data=[1,2,3,4,8,9,5,6,7]
for i in data:
q=ListNode(i)
q.next=None
if list==None:
list=p=q
else:
p.next=q
p=p.next
r=Solution()
res=r.reverseKGroup(list,3)
while res!=None:
print(res.val);
res=res.next