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 ...
随机推荐
- 4. NFS存储服务器搭建
1.什么是NFS? Network file system 网络文件系统 nfs共享存储 2.nfs能干什么? nfs 能为 不同主机系统之间 实现 文件的共享 3.为什么要使用nfs? 在集群架构中 ...
- Spring Boot项目中如何定制PropertyEditors
本文首发于个人网站:Spring Boot项目中如何定制PropertyEditors 在Spring Boot: 定制HTTP消息转换器一文中我们学习了如何配置消息转换器用于HTTP请求和响应数据, ...
- EFK教程 - EFK快速入门指南
通过部署elasticsearch(三节点)+filebeat+kibana快速入门EFK,并搭建起可用的demo环境测试效果 作者:"发颠的小狼",欢迎转载与投稿 目录 ▪ 用途 ...
- 元组/字典/集合内置方法+简单哈希表(day07整理)
目录 二十三.元组内置方法 二十四.字典数据类型 二十五 集合内置方法 二十五.数据类型总结 二十六.深浅拷贝 补充:散列表(哈希表) 二十三.元组内置方法 什么是元组:只可取,不可更改的列表 作用: ...
- 基于 HTML5 + Canvas 实现的 PID 可视化系统
前言 随着工业物联网和互联网技术的普及和发展,人工填料的方式已经逐渐被机械设备取代.工业厂商减小误操作.提升设备安全以及追求高效率等制造特点对设备的要求愈加高标准.严要求.同时机械生产以后还需遵从整个 ...
- leetcode系列---atoiFunction C#code
Function: /// <summary> /// ToInt /// </summary> /// <param name="str">& ...
- vue学习笔记(一)入门
前言 随着前端不断的壮大,许多公司对于前端开发者的需求也越来越多了,作为一名优秀的前端工程师,如果连vue和react都不会的话,那真是out了,为什么那么说呢?这是我在招聘网站上截的一张图,十家公司 ...
- Java HashSet对txt文本内容去重(统计小说用过的字或字数)
Java HashSet对txt文本内容去重(统计小说用过的字或字数) 基本思路: 1.字节流读需要去重的txt文本.(展示demo为当前workspace下名为utf-8.txt的文本) 2.对读取 ...
- H5 + WebGL 实现的地铁站 3D 可视化系统
前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...
- Vue+element UI实现分页组件
介绍 这是一个是基于element-UI的分页组件基础上,进行了二次封装的分页组件,在展示数据时,该分页组件采用了每显示一页数据,只请求当前页面的数据的请求策略,从而避免了一次性将数据全部请求所造成的 ...