描述
给你一个链表以及一个k,将这个链表从头指针开始每k个翻转一下。
链表元素个数不是k不用翻转。
您在真实的面试中是否遇到过这个题?
是
样例
给出链表 1->2->3->4->5
k = 2
, 返回 2->1->4->3->5
k = 3
, 返回 3->2->1->4->5
此题是上一题的加强版,困难级别,要说这一题难也难,指针的问题比较复杂混乱,在面试中很难写出没有bug的答案。要说不难也不难,无非是考验工程能力,细化每个问题。
翻转链表如果不会的同学看我上一篇:https://blog.csdn.net/wenqiwenqi123/article/details/80624929
然后来说一说这一题的思路,两个步骤:
1、检查是否还剩k个数,如果还剩k以上的数,则之后k个数翻转。如果不足k个数,不翻转。
2、翻转这k个数。翻转k个数需要注意,在此段序列之前的那个node的next指针需要调整。
具体请看代码注释:
class ListNode(object):
def __init__(self, val, next=None):
self.val = val
self.next = next
class Solution:
"""
@param head: a ListNode
@param k: An integer
@return: a ListNode
"""
def reverseKGroup(self, head, k):
# write your code here
#检查之后是否还有k个数
def check(head,k):
for i in range(k):
if(head.next==None):return False
head=head.next
return True
def reverse(dummy,k):
#输入的dummy为要反转的序列的前一个node
#即输入的时候为 dummy [1,2,3,4...k]
#最终return时候为 dummy [k,k-1,...,3,2,1] . return 1
head=dummy.next
save=dummy
result=dummy.next
i=0
while (True):
pre = head.next
head.next = dummy
dummy = head
head = pre
i=i+1
result.next = pre
if (i >=k): break
#return的是反转后的尾巴
save.next=dummy
return result
if(k==1):return head
dummy = ListNode(None)
result=dummy
dummy.next = head
while(check(dummy,k)):
dummy=reverse(dummy,k)
return result.next
node1 = ListNode(1)
node2 = ListNode(2)
node3=ListNode(3)
node4=ListNode(4)
# node5=ListNode(5)
node1.next = node2
node2.next = node3
node3.next = node4
# node4.next = node5
s = Solution()
result = s.reverseKGroup(node1,4)
while (result != None):
print(result.val)
result = result.next