我们在上篇文章里面提到了链表的翻转,给定一个链表,对每两个相邻的节点作交换,并返回头节点,今天的这道题是它的升级版,如下:

k个一组翻转链表

给出一个链表,每 个节点一组进行翻转,并返回翻转后的链表。

是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 的整数倍,那么将最后剩余节点保持原有顺序。

示例 :

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

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

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

说明 :

  • 你的算法只能使用常数的额外空间。

  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

解题思路:

    这道题让我们以每K个为一组来翻转链表,实际上是把原链表分成若干个小段,然后对没一个小段进行翻转。那么我们就能想到他是需要两个函数的,一个是来做分段的,一个是在对每一段做翻转的。我们就以题中给出的例子来看的话,1>2>3>4>5, k=3.一般在处理链表问题的时候,因为单向链表是不可逆的,只能从前往后遍历,所以我们一般在开头添加一个头结点,记录当前最新的头结点,值一般给为-1,那么新的链表就变为了-1>1>2>3>4>5.k=3,那么我们需要把1>2>3做翻转,做翻转的时候我们需要两个指针,pre和next分别指向要被翻转的链表的前后的位置,在这里也就是pre=-1,next=4,那么翻转完1>2>3之后变为-1>3>2>1>4>5,这个时候的pre指针应该是1。如下:

-1->1->2->3->4->5
| |
pre         next -1->3->2->1->4->5
| |
        pre next

就这样循环,只要循环了k个节点,就可以调用翻转函数来进行局部的翻转,翻转函数返回翻转后的链表的新的pre节点,实现方法如下:

def reverseOneGroup(pre_node, next_node):
last_node = pre_node.next
cur_node = last_node.next
while cur_node != next_node:
last_node.next = cur_node.next
cur_node.next = pre_node.next
pre_node.next = cur_node
cur_node = last_node.next return last_node

  

在翻转函数中,定义两个三个指针,一个是pre指针,一个是last指针,一个是cur指针,pre指针是链表的头指针,cur指针是目前循环到的节点指针,last指针是当前循环到指针cur的前置节点指针,每次翻转cur的时间,只需要把last的next指向cur的next,cur的next指向pre的next,pre的next指向cur就好,然后cur就迭代下一个node,为last的next指针。总体的实现代码如下:

# Definition for singly-linked list.
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None def reverseOneGroup(pre_node, next_node):
last_node = pre_node.next
cur_node = last_node.next
while cur_node != next_node:
last_node.next = cur_node.next
cur_node.next = pre_node.next
pre_node.next = cur_node
cur_node = last_node.next return last_node class Solution(object):
def reverseKGroup(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if k == 1 or not head:
return head
dump = ListNode(-1)
dump.next = head
pre = dump
cur = head
i = 0
while cur:
i += 1
if i % k == 0:
pre = reverseOneGroup(pre, cur.next)
cur = pre.next
else:
cur = cur.next return dump.next

  

我的这个实现方法应该是我能想到的最常规,最简单的算法,肯定会有其他的算法实现,大家可以探讨一下,比如在一个函数里实现,比如像上一篇文章一样使用递归,大家可以一起交流,欢迎给我留言,交流。

coding交流群:226704167,,郑州程序员群:59236263愿和各位一起进步!

微信公众号:

数据结构与算法 —— 链表linked list(04)的更多相关文章

  1. 数据结构与算法 —— 链表linked list(01)

    链表(维基百科) 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储, ...

  2. 数据结构与算法 —— 链表linked list(03)

    继续关于linked list的算法题: 删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素使得每个元素只留下一个. 案例: 给定 1->1->2,返回 1->2 给定  ...

  3. 数据结构与算法 —— 链表linked list(06)

    回文链表 链接 请检查一个链表是否为回文链表. 进阶:你能在 O(n) 的时间和 O(1) 的额外空间中做到吗? 解题思路: 回文链表的特点就是对称. 把链表放到栈中去,利用栈的先进后出的规则,和原链 ...

  4. 数据结构与算法——链表 Linked List(单链表、双向链表、单向环形链表-Josephu 问题)

    链表是有序的列表,但是在内存中存储图下图所示 链表是以 节点 的方式来存储,是 链式存储 每个节点包含 data 域.next 域,指向下一个节点 链表的各个节点 不一定是连续存储,如上图所示 链表还 ...

  5. 数据结构与算法 —— 链表linked list(02)

    我们继续来看链表的第二道题,来自于leetcode: 两数相加 给定两个非空链表来代表两个非负整数,位数按照逆序方式存储,它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了 ...

  6. 数据结构与算法 —— 链表linked list(05)

    反转一个单链表. 进阶:链表可以迭代或递归地反转.你能否两个都实现一遍? 示例 : 给定这个链表:1->2->3->4->5 返回结果: 5->4->3->2 ...

  7. JavaScript数据结构与算法-链表练习

    链表的实现 一. 单向链表 // Node类 function Node (element) { this.element = element; this.next = null; } // Link ...

  8. 《数据结构与算法之美》 <04>链表(上):如何实现LRU缓存淘汰算法?

    今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是 LRU 缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...

  9. python数据结构与算法——链表

    具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...

随机推荐

  1. [活动] 【奖品撩人】部落守卫者集结令·这一回同程SRC的安全由“我”守卫!

    i春秋SRC部落联合同程SRC发布首届部落守卫者漏洞提交任务(代号G001)! 你准备好了吗! [部落守卫者集结令]拿巨额奖金?上白帽子排行榜?近距离膜拜大佬?学技术?掌握窍门?又或者你是个责任感爆棚 ...

  2. C#/AutoCAD 2018/ObjectArx/二次开发再说实体(六)

    这些函数对大家很有用,如果想获取详细源代码请加云幽学院yunyou.ke.qq.com报名免费课程,如果想学习更系统.更全面的知识请报名收费课程,有大量开发案例共享. 1.获取模型空间中所有实体 #r ...

  3. JavaScript(简介)【Javascript历史】

    学习一门知识应该了解其背景,很多人认为会用就行,起初我也是这么认为的,但后来才知道对起源的了解也很必要,从事javascript开发5年,今天开始总结一些笔记,分享下. 一.什么是JavaScript ...

  4. 福州大学软工1715|W班-启航

    新的一学期即将开启,而在仅剩的几天的时间内,我将为接下来的软工实践助教事宜忙碌起来.要学习的东西很多,要关注的东西也很多. 虽然我现在还在茫然阶段,虽然我对<构建之法>还不太熟悉,但是,我 ...

  5. C语言博客-指针

    一.PTA实验作业(5分) 题目1:6-1 两个4位正整数的后两位互换 1. 本题PTA提交列表 2. 设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明. 无 题目2:6-3 ...

  6. 敏捷冲刺每日报告——Day2

    1.情况简述 Alpha阶段第一次Scrum Meeting 敏捷开发起止时间 2017.10.26 00:00 -- 2017.10.27 00:00 讨论时间地点 2017.10.26晚9:30, ...

  7. Vim 游戏 2048

    给大家介绍一款可以在Vim里面玩的游戏 vim2048. 界面如图: 操作非常简单,可以用 hjkl 或者 上下左右方向键移动 项目开源地址为: https://github.com/wsdjeg/v ...

  8. vue class与style 绑定详解——小白速会

    一.绑定class的几种方式 1.对象语法 直接看例子: <div id="app3"> <div :class="{'success':isSucce ...

  9. MSIL实用指南-生成接口

    本篇讲解怎么样生成接口,即interface. 一.创建类型创建一个接口类型依旧用ModuleBuilder的DefineType方法,但是它的第二个参数必须要有TypeAttributes.Inte ...

  10. LeetCode & Q122-Best Time to Buy and Sell Stock II-Easy

    Description: Say you have an array for which the ith element is the price of a given stock on day i. ...