• 25K个一组翻转列表


    题目:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
    要求:只能使用常数的额外空间。需要实际进行节点交换。

    tip:
    1.head是第一个结点,需要另外添加结点hair在head前面,返回hair.next
    2.链表翻转时,确定前驱和后继结点,组结点内部逐个改变链接方向
    3.链接内部结点翻转固定操作单独写成函数
    4.python是动态语言,可以直接把对象赋值给新的变量。在C/C++中,通常采用“指针+结构体”来实现链表;而在Python中,则可以采用“引用+类”来实现链表。

    #python
    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        # 翻转子链表,从前向后将子链表中结点按照头插法逐个插在组后结点之前,实现翻转
        def reverse(self, head: ListNode, tail: ListNode):
            prev = tail.next
            p = head
            while prev != tail:
                nex = p.next
                p.next = prev
                prev = p
                p = nex
            return tail, head
    
        def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
            hair = ListNode(0)
            hair.next = head
            pre = hair
    
            while head:
                tail = pre
                # 查看剩余部分长度是否大于等于 k
                for i in range(k):
                    tail = tail.next
                    if not tail:
                        return hair.next
                nex = tail.next
                head, tail = self.reverse(head, tail)
                # 把子链表重新接回原链表
                pre.next = head
                tail.next = nex
                pre = tail
                head = tail.next
            
            return hair.next
    
    
  • 相关阅读:
    Ubuntu 15.04 下apt-get安装JDK
    Ubuntu下apt-get安装Java,Tomcat
    虚拟化技术比较 PV HVM
    Java8 Lambda表达式教程
    SpringMVC实现上传和下载
    web.xml中的url-pattern映射规则
    java文件读写操作大全
    Java创建文件
    JAVA文件中获取路径及WEB应用程序获取路径方法
    session.flush()与session.clear()的区别及使用环境
  • 原文地址:https://www.cnblogs.com/centralpark/p/12901185.html
Copyright © 2020-2023  润新知