题目描述

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的更多相关文章

  1. [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 ...

  2. 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 算法思想:基本操作就是链表 ...

  3. 【LeetCode】863. All Nodes Distance K in Binary Tree 解题报告(Python)

    [LeetCode]863. All Nodes Distance K in Binary Tree 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...

  4. [Leetcode][Python]24: Swap Nodes in Pairs

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 24: Swap Nodes in Pairshttps://oj.leetc ...

  5. 【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 ...

  6. 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 ...

  7. 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 ...

  8. 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. ...

  9. [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 ...

随机推荐

  1. .NET Core 3.0之深入源码理解ObjectPool(二)

    写在前面 前文主要介绍了ObjectPool的一些理论基础,本文主要从源码角度理解Microsoft.Extensions.ObjectPool是如何实现的.下图为其三大核心组件图: 核心组件 Obj ...

  2. Mysql数据库(八)存储过程与存储函数

    一.创建存储过程与存储函数 1.创建存储过程(实现统计tb_borrow1数据表中指定图书编号的图书的借阅次数) mysql> delimiter // mysql> CREATE PRO ...

  3. 数据结构(四十四)交换排序(1.冒泡排序(O(n²))2.快速排序(O(nlogn))))

    一.交换排序的定义 利用交换数据元素的位置进行排序的方法称为交换排序.常用的交换排序方法有冒泡排序和快速排序算法.快速排序算法是一种分区交换排序算法. 二.冒泡排序 1.冒泡排序的定义 冒泡排序(Bu ...

  4. django-URL之path标准语法(三)

    path(route,vie,nane=None,**kwargs) route:表示路径,从端口以后URL的地址,到/结束.(必选) view:表示匹配成功后,需要调用的视图,view必须是个函数, ...

  5. Mybaits 源码解析 (六)----- 全网最详细:Select 语句的执行过程分析(上篇)(Mapper方法是如何调用到XML中的SQL的?)

    上一篇我们分析了Mapper接口代理类的生成,本篇接着分析是如何调用到XML中的SQL 我们回顾一下MapperMethod 的execute方法 public Object execute(SqlS ...

  6. ArangoDB简单实例介绍

    数据介绍: 2008美国国内航班数据 airports.csv flights.csv 数据下载地址:https://www.arangodb.com/graphcourse_demodata_ara ...

  7. php经典设计模式和Trait类代码的复用

    PHP经典设计模式 <?php /** * 单例模式 */ class Site { #定义属性 public $siteName; #定义本类的静态实例 protected static $i ...

  8. 爬虫之scrapy简单案例之猫眼

    在爬虫py文件下 class TopSpider(scrapy.Spider): name = 'top' allowed_domains = ['maoyan.com'] start_urls = ...

  9. [专题总结]2-sat及题目&题解(2/5 complete)

    啥啥啥2-sat今天就是最后一天了???我才打两道题啊... %%%yxm永远领先全世界... 为了防止学=没学所以还是要记一下,防止忘也确认自己真正理解了吧. 2-sat是指2适应性问题,然而知道这 ...

  10. [考试反思]0927csp-s模拟测试53:沦陷

    很喜欢Yu-shi说过的一句话 在OI里,菜即是原罪 对啊. 都会.谁信呢? 没有分数,你说话算什么呢? 你就是菜,你就是不对,没有别的道理. 最没有用的,莫过于改题大神,这就是菜的借口. 但是其实这 ...