首页 > 其他 > 详细

leetcode 25. K 个一组翻转链表

时间:2020-02-23 21:56:16      阅读:81      评论:0      收藏:0      [点我收藏+]
# coding:utf-8

__author__ = "sn"

"""
25. K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
"""

"""
思路:

"""


class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution(object):
    def reverseKGroup(self, head, k: int):
        """
        每k个结点为一组进行翻转
        在首部添加dummy后使用尾插法实现
        边界处理方法为如果最后一次翻转的结点数量小于k,对该组结点再翻转一次
        时间复杂度:O(N)+O(k)= O(N),遍历一次
        空间复杂度:O(1)
        :param head:
        :param k:
        :return:
        """
        dummy = ListNode(0)
        dummy.next = head

        p = dummy

        while p and p.next:
            # k个为一组进行翻转
            pre, p = p, p.next
            n = k
            while n > 1 and p.next:
                q = p.next
                p.next, q.next = q.next, pre.next
                pre.next = q
                n -= 1
            # 尾部结点不足k个处理
            if n > 1:
                p = pre.next
                while p.next:
                    q = p.next
                    p.next, q.next = q.next, pre.next
                    pre.next = q
                break
        return dummy.next


def test():

    # 获取并执行Solution类中的解决方法
    so = Solution()
    func_list = [x for x in dir(so) if not x.startswith(‘__‘)]
    print(‘\r\n‘*2, "方法列表:", func_list, ‘\r\n‘*2)

    # 生成链表
    from leet_code_list_pkg import LinkedList
    ll_class = LinkedList()
    linked_list = ll_class.make_linkedlist(list(range(1,10)))
    ll_class.print_linkedlist(linked_list)

    # 设置参数
    #para = (linked_list, 3)

    # 依次执行Solution类中的方法
    for i, _ in enumerate(func_list):
        # 设置参数
        linked_list = ll_class.make_linkedlist(list(range(1, 19)))
        para = (linked_list, 5)
        func = getattr(so, _)
        res = func(*para)
        # 打印方法说明文档
        print("*"*40, "\r\n方法[%s]:%s\r\n说明:%s"%(i, func.__name__, func.__doc__.replace(‘    ‘, ‘‘)), ‘\r\n执行结果:‘)
        # 打印执行结果
        ll_class.print_linkedlist(res)
        #func_print_list(res)
        #print(res)
        print(‘\r\n‘*2)



if __name__ == "__main__":
    test()
    pass

leetcode 25. K 个一组翻转链表

原文:https://www.cnblogs.com/wodeboke-y/p/12354224.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!