描述
给你一个链表以及一个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