Leetcode 25/24 - Reverse Nodes in k-Group
题目描述
Leetcode 24 题主要考察的链表的反转,而 25 题是 24 的拓展版,加上对递归的考察。
对题目做一下概述:
提供一个链表,给定一个正整数 k, 每 k 个节点一组进行翻转,最后返回翻转后的新链表。
k 的值小于或等于链表的长度,如果节点总数不是 k 的整数倍,将最后一组剩余的节点保持原有顺序。
注意:
- 算法只能使用常数的空间
 - 不能单纯的改变节点内部的值,需要进行节点交换。
 
举例:
Example:
Given 1->2->3->4->5.
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
Given 1->2.
For k = 2, you should return: 2->1
For k = 3, you should return: 1->2
解题思路
主要考察来了我们对链表的反转已经递归思想的熟悉度。
对链表反转时,可以借助三个指针,pre,current,next
- pre 表示被翻转节点的前一个节点
 - current 表示正在被翻转的节点
 - next 表示正在被翻转的下一个节点
 

每次翻转时:
- next 指向 current 的下一个
 - current 的 next 指向 prev
 - 同时 current 和 prev 向前一步
 
在每次翻转后:
- current 表示下一个需要被翻转组中的第一个节点
 - prev 表示当前翻转后的新链表头
 - 原来的头 head 成了被翻转组中的尾节点
 
递归的处理
首先看到 K 个一组,想到到局部处理,并且局部处理翻转的方式是一致的,自然联想到递归。
递归的出口就是,被翻转后的新链表头或者未满足条件无需翻转的链表头。
代码实现:
# Question: Reverse Nodes in k-Group
# Given a linked list, reverse the nodes of a linked list k at a time and
# return its modified list.
#
# k is a positive integer and is less than or equal to the length of the linked
# list. If the number of nodes is not a multiple of k then left-out nodes in the
# end should remain as it is.
# Example:
# Given 1->2->3->4->5.
# For k = 2, you should return: 2->1->4->3->5
# For k = 3, you should return: 3->2->1->4->5
# Note:
# Only constant extra memory is allowed.
# You may not alter the values in the list's nodes, only nodes itself
# may be changed.
# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class Solution:
    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        # check if head is NULL List
        if head is None or head.next is None:
            return head
        # get the number of nodes
        list_length = 0
        new_head = head
        while new_head is not None:
            list_length += 1
            new_head = new_head.next
        # If the length of nodes is less than the number of group
        if list_length < k:
            return head
        # calculate the number of groups that can be reversed
        number_of_groups = int(list_length / k)
        return self.swapPairs(head, k, number_of_groups)
    def swapPairs(self, head: ListNode, k, number_of_groups, number_of_reversed_groups=0) -> ListNode:
        prev = None
        current = head
        n = k
        # reverse the node due to the count of n
        # After the reversal is completed,
        # prev is the new head of the group that has been reversed.
        # current points the head of the next group to be processed.
        # head is the new end of the group that has been reversed.
        while current and n > 0:
            n -= 1
            next = current.next
            current.next = prev
            prev = current
            current = next
        # after a group of nodes is reversed, then increase 1.
        number_of_reversed_groups += 1
        # determine whether to reverse the next group
        if current is not None and number_of_reversed_groups < number_of_groups:
            head.next = self.swapPairs(
                current, k, number_of_groups, number_of_reversed_groups)
        else:
            head.next = current
        return prev
    def print_list_node(self, head: ListNode):
        result = ''
        while head is not None:
            result += str(head.val) + '->'
            head = head.next
        print(result.rstrip('->'))
if __name__ == '__main__':
    l1 = ListNode(1)
    l2 = ListNode(2)
    l3 = ListNode(3)
    l4 = ListNode(4)
    l5 = ListNode(5)
    l1.next = l2
    l2.next = l3
    l3.next = l4
    l4.next = l5
    solution = Solution()
    solution.print_list_node(l1)
    reversed_l1 = solution.reverseKGroup(l1, 2)
    solution.print_list_node(reversed_l1)
												
											Leetcode 25/24 - Reverse Nodes in k-Group的更多相关文章
- [Leetcode] Reverse nodes in k group 每k个一组反转链表
		
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...
 - Reverse Nodes In K Group,将链表每k个元素为一组进行反转---特例Swap Nodes in Pairs,成对儿反转
		
问题描述:1->2->3->4,假设k=2进行反转,得到2->1->4->3:k=3进行反转,得到3->2->1->4 算法思想:基本操作就是链表 ...
 - 【LeetCode】863. All Nodes Distance K in Binary Tree 解题报告(Python)
		
[LeetCode]863. All Nodes Distance K in Binary Tree 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...
 - [Leetcode][Python]24: Swap Nodes in Pairs
		
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 24: Swap Nodes in Pairshttps://oj.leetc ...
 - 【LeetCode】24. Swap Nodes in Pairs (3 solutions)
		
Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For exam ...
 - LeetCode解题报告—— Reverse Nodes in k-Group && Sudoku Solver
		
1. Reverse Nodes in k-Group Given a linked list, reverse the nodes of a linked list k at a time and ...
 - LeetCode OJ:Reverse Nodes in k-Group(K个K个的分割节点)
		
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...
 - LeetCode(25)Reverse Nodes in k-Group
		
题目 Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...
 - [leetcode]算法题目 - Reverse Nodes in k-Group
		
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...
 
随机推荐
- V2er - Best client for V2EX
			
V2er - Best client for V2EX 可能是体验最好的掌上 V2EX 客户端,专为 iOS 打造并在 Github 开源. 关于 V2EX,V2EX 是创意工作者们的社区.这里目前汇 ...
 - 使用 pdf.js 在网页中加载 pdf 文件
			
在网页中加载并显示PDF文件是最常见的业务需求.例如以下应用场景:(1)在电商网站上购物之后,下载电子发票之前先预览发票.(2)电子商务管理系统中查看发布的公文,公文文件一般是PDF格式的文件. 目前 ...
 - C++ 大作业资料总结
			
一般 C++ 大作业都是用 Qt 来写,Qt 本身带了很多例子,详见:https://doc.qt.io/qt-5/qtexamples.html# 如果你想偷懒的话,直接拿来改就好,或者去 Gith ...
 - scp   -本地文件上传服务器,指定端口
			
scp 命令可以将本地文件上传服务器,或者将服务器上的文件下载到本地, 1. 上传服务器: scp [本地文件目录] [服务器用户名]@[服务器名]:/[服务器上文件路径] 比如 scp /Doc ...
 - Kafka权威指南阅读笔记(第五章)
			
Kafka Broker kafka 第一个启动的Broker在ZooKeeper中创建一个临时节点/controller,让自己成为控制器.其他Broker启动后在控制器节点上创建Watch对象,便 ...
 - 使用Wireshark成功解决JavaWeb项目的页面一直加载中的问题
			
现象 打开 服务器页面 10.2.155.100,然后发现页面JS显示 加载中..F12浏览器看起来像是发起css等静态资源时卡死.一时定位还以为时 前端的问题. 解决过程 上服务器抓包: tcpdu ...
 - win10系统格式化、恢复出厂设置的操作步骤
			
恢复电脑出厂设置具体步骤
 - Pytorch数据集读入——Dataset类,实现数据集打乱Shuffle
			
在进行相关平台的练习过程中,由于要自己导入数据集,而导入方法在市面上五花八门,各种库都可以应用,在这个过程中我准备尝试torchvision的库dataset torchvision.datasets ...
 - activeMQ 安装及启动异常处理
			
一.环境: [root@centos_6 ~]# cat /etc/system-release CentOS release 6.5 (Final) [root@centos_6 ~]# uname ...
 - QHDYZ模拟赛20191012
			
今天信息处老师(并不是教练,基本等于机房看门大爷) (好吧老师其实很犇,软件什么的厉害的一批,只是不能带oi--) 跟我说:"xxj,过两天月考完了,可以在初赛前再整一次模拟赛,一天,三道题 ...