python--lintcode450. K组翻转链表

时间:2022-02-16 16:24:45

描述

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