python--lintcode450. K组翻转链表

描述

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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哎呦不错的温jay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值