zoukankan      html  css  js  c++  java
  • 翻转链表中相邻的k个节点

    示例:

    输入:1->2->3->4->5

    k=2 输出:2->1->4->3->5

    k=3输出:3->2->1->4->5

    Python解决方案1:

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution(object):
        def reverseKGroup(self, head, k):
            """
            :type head: ListNode
            :type k: int
            :rtype: ListNode
            """
            if k == 1:
                return head
            
            out_head = ListNode(0)
            out = out_head       
            
            while head:
                i = 0
                part = ListNode(0)
                new = part
                while i < k and head:
                    part.next = head
                    head = head.next
                    part = part.next
                    i += 1
                    
                if i == k:
                    part.next = None
                    out.next, last = self.reverse(new.next)
                    out = last
                else:
                    out.next = new.next
            return out_head.next
        
        def reverse(self,head):
            prev = None
            while head:
                head.next,prev,head = prev,head,head.next
            last = prev
            
            while last.next:
                last = last.next    
            return prev,last

    Python解决方案2:

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    class Solution(object):
    def reverseKGroup(self, head, k):
    """
    :type head: ListNode
    :type k: int
    :rtype: ListNode
    """
    if k == 1:
    return head
    out = ListNode(1)
    out_head = out
    while head:
    prev = None
    i = 0
    # 翻转k个相邻的节点
    while i < k and head:
    head.next,prev,head = prev,head,head.next
    if i == 0:
    last = prev
    i += 1
    # 将翻转后的短链表连接到要输出的链表后面
    if i == k:
    out_head.next = prev
    out_head = last
    # 最后一次翻转如果没有k个节点,则再翻转一次恢复原来的顺序
    else:
    re_pre = None
    while prev:
    prev.next,re_pre,prev = re_pre,prev,prev.next
    out_head.next = re_pre
    return out.next
  • 相关阅读:
    Python 3: 加密简介
    5 个最受人喜爱的开源 Django 包
    ROS tf-增加坐标系
    ROS tf监听编写
    ROS tf广播编写
    ROS tf基础使用知识
    ROS tf-数据类型
    Windows Vistual Studio 2013/2015 MRPT安装
    OMPL 在windows下的安装
    CMake 设置Target输出目录和后缀名
  • 原文地址:https://www.cnblogs.com/wenqinchao/p/10676959.html
Copyright © 2011-2022 走看看