zoukankan      html  css  js  c++  java
  • 刷题——K个一组翻转链表

    先看题目

    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

    k 是一个正整数,它的值小于或等于链表的长度。

    如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

    示例 :

    给定这个链表:1->2->3->4->5

    当 k = 2 时,应当返回: 2->1->4->3->5

    当 k = 3 时,应当返回: 3->2->1->4->5

    说明 :

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


    没什么可以说的直接暴力就好了,不过这里用到了栈

    # 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
            """
            dummy = point = ListNode(0)
            while True:
                temp = head
                count = k
                stack = []
                while count and temp:
                    stack.append(temp)
                    temp = temp.next
                    count -= 1
                if count:
                    point.next = head
                    break
                while stack:
                    point.next = stack.pop()
                    point = point.next
                point.next = temp
                head = temp
            return dummy.next
    

    每次放进去k个到stack[]里面,然后取出来,取都选最上面的,所以这样存取的时候就正好达到了题目要求的效果。

    按照道理来说这样来说,应该就可以没事啦,可以我看到一位大神的递归法当时就研究起来了,真的是只可意会不可言传,估计要积攒很多解题的经验才能有这样的思路吧,好在紧忙看了半天搞懂了其中的思路,而且时间比上面的用栈的要快

    一些值得注意的地方我也注释了,解题嘛,用不同的方法去解决挺有成就感的,就像题目以各种方式去让你失败一样,自己用多种方式去通过题目的测试很好玩。

    # 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):
            cur = head # head是k个节点的第一个
            count = 0
            while cur and count < k:
                cur = cur.next
                count += 1
            if count == k:
                cur = self.reverseKGroup(cur, k) # 循环到最后不足K的节点(即次节点之后就是剩余节点)
                while count:
                    temp = head.next # 临时存放head.next
                    
                    head.next = cur
                    cur = head
                    
                    head = temp #下一个
                    count -= 1
                head = cur
            return head
    
  • 相关阅读:
    Linux ansible 常用模块二
    Linux之ansible 常用模块
    flask websocket实现用例
    flask--上下文原理
    python Django
    python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式
    并发编程 process 模块的方法及运用 僵尸与孤儿
    python 并发编程 操作系统 进程 并发.并行 及 同步/异步,阻塞/非阻塞
    python 网络编程粘包解决方案2 + ftp上传 + socketserver
    第一节 机器学习基础
  • 原文地址:https://www.cnblogs.com/fanwenkeer/p/11279960.html
Copyright © 2011-2022 走看看