数据结构与算法 —— 链表linked list(04)
我们在上篇文章里面提到了链表的翻转,给定一个链表,对每两个相邻的节点作交换,并返回头节点,今天的这道题是它的升级版,如下:
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 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)的更多相关文章
- 数据结构与算法 —— 链表linked list(01)
链表(维基百科) 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储, ...
- 数据结构与算法 —— 链表linked list(03)
继续关于linked list的算法题: 删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素使得每个元素只留下一个. 案例: 给定 1->1->2,返回 1->2 给定 ...
- 数据结构与算法 —— 链表linked list(06)
回文链表 链接 请检查一个链表是否为回文链表. 进阶:你能在 O(n) 的时间和 O(1) 的额外空间中做到吗? 解题思路: 回文链表的特点就是对称. 把链表放到栈中去,利用栈的先进后出的规则,和原链 ...
- 数据结构与算法——链表 Linked List(单链表、双向链表、单向环形链表-Josephu 问题)
链表是有序的列表,但是在内存中存储图下图所示 链表是以 节点 的方式来存储,是 链式存储 每个节点包含 data 域.next 域,指向下一个节点 链表的各个节点 不一定是连续存储,如上图所示 链表还 ...
- 数据结构与算法 —— 链表linked list(02)
我们继续来看链表的第二道题,来自于leetcode: 两数相加 给定两个非空链表来代表两个非负整数,位数按照逆序方式存储,它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了 ...
- 数据结构与算法 —— 链表linked list(05)
反转一个单链表. 进阶:链表可以迭代或递归地反转.你能否两个都实现一遍? 示例 : 给定这个链表:1->2->3->4->5 返回结果: 5->4->3->2 ...
- JavaScript数据结构与算法-链表练习
链表的实现 一. 单向链表 // Node类 function Node (element) { this.element = element; this.next = null; } // Link ...
- 《数据结构与算法之美》 <04>链表(上):如何实现LRU缓存淘汰算法?
今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是 LRU 缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...
- python数据结构与算法——链表
具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...
随机推荐
- 微信公众平台开发,图文回复、access_token生成调用、以及微信SDK的实现(2)
上一节课,我给大家分享了微信API接入以及事件推送的回复,这是微信开发的第二节课,重点给说一说单图文回复,多图文回复,access_token,微信SDK. 公众号消息回复很多种形式,常见的形式有,文 ...
- C#触发器知识总结及案例
触发器 触发器是在对表进行插入.更新.删除操作时自动执行的存储过程,常用于强制业务规则,是一种高级约束,可以定义比用check约束更为复杂的约束.可以执行复杂的SQL语句(if/while/case) ...
- 201621123040《Java程序设计》第六周学习总结
1.本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结 2.书面作业 2.1clone方法 2.1.1在te ...
- 判断mine类型
var http = require("http"); var fs = require("fs"); var url = require("url& ...
- docopt——好用的Python命令行参数解释器
Qingchat使用的命令行参数解释器是 docopt,用下来感觉非常棒,所以决定介绍一下这个库.( 奉劝各位看官,真爱生命,远离argparse. ) 介绍 docopt 本质上是在 Python ...
- scrapy crawl xmlfeed spider
from scrapy.spiders import XMLFeedSpider from myxml.items import MyxmlItem class XmlspiderSpider(XML ...
- Mysql数据库的触发程序
/** **创建表 */ CREATE TABLE test1(a1 INT); CREATE TABLE test2(a2 INT); CREATE TABLE test3(a3 INT NOT N ...
- jsp文件调用本地文件的方法(Tomcat server.xml 设置虚拟目录)
JSP文件: <video id="my-video" class="video-js" controls preload="auto" ...
- python 中 reduce 函数的使用
reduce()函数也是Python内置的一个高阶函数. reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接 ...
- pygame事件之——控制物体(飞机)的移动
近来想用pygame做做游戏,在 xishui 大神的目光博客中学了学这东西,就上一段自己写的飞机大战的代码,主要是对键盘控制飞机的移动做了相关的优化 # -*- coding: utf-8 -*- ...