Python 数据结构之旋转链表


Posted in Python onFebruary 25, 2017

题目描述:给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数

样例:给出链表1->2->3->4->5->null和k=2;返回4->5->1->2->3->null

首先,观察一下这个题目要达到的目的,其实,换一种说法,可以这样来描述:给出一个k值,将链表从倒数第k个节点处起之后的部分移动到链表前面,就样例来说,其实是将4->5这一部分移动到整个链表前面,变成4->5->1->2->3->null。不过,需要注意的是,题中没有给出k的大小,当k比链表的长度还大的时候,我们就需要先用k对链表的长度求余,比如,如果k = 7,那么上面的例子还是将4->5移动到整个链表前面。

所以说,这个题的思路可以这样来总结:

1. 先求出整个链表的长度
2. 根据k值找到需要移动的部分链表的前驱(样例中的3)
3. 在前驱之后将链表断开,移动后半部分

代码如下:

# Definition for singly-linked list. 
# class ListNode: 
#   def __init__(self, x): 
#     self.val = x 
#     self.next = None 
 
class Solution: 
  # @param head: the list 
  # @param k: rotate to the right k places 
  # @return: the list after rotation 
  def rotateRight(self, head, k): 
    if head is None: 
      return head 
    cur = head 
    count = 1 
    # 计算链表长度 
    while cur.next: 
      cur = cur.next 
      count += 1 
    # 为节省代码量,这里是一个很有技巧的处理:用尾节点链接头结点 
    cur.next = head 
    # 此处,k为cur从尾节点到要断开部分的前驱需走的步数 
    k = count - k % count 
    # 找到前驱 
    while k != 0: 
      cur = cur.next 
      k -= 1 
    # 断开 
    head = cur.next 
    cur.next = None 
    # 因为首尾已经相连,所以直接返回前驱后面的那个节点即可,此处引用为head 
    return head 
    # write your code here

需要注意的是21行首尾相连的技巧,这大大节省了我们的代码量,其实,就按之前思路中所描述的一步步来,也没问题。但是这个技巧确实很棒,值得学习。具体的细节我写在了代码注释里。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python中的二叉树查找算法模块使用指南
Jul 04 Python
跟老齐学Python之Python文档
Oct 10 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
May 07 Python
强悍的Python读取大文件的解决方案
Feb 16 Python
在python中,使用scatter绘制散点图的实例
Jul 03 Python
Django Rest framework认证组件详细用法
Jul 25 Python
wxPython实现画图板
Aug 27 Python
Python中顺序表原理与实现方法详解
Dec 03 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
Python中常用的高阶函数实例详解
Feb 21 Python
使用jupyter notebook直接打开.md格式的文件
Apr 10 Python
python 写一个文件分发小程序
Dec 05 Python
Python数据结构之翻转链表
Feb 25 #Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 #Python
python函数的5种参数详解
Feb 24 #Python
Python实现读取文件最后n行的方法
Feb 23 #Python
Python基础教程之tcp socket编程详解及简单实例
Feb 23 #Python
Python命令启动Web服务器实例详解
Feb 23 #Python
Python 基础教程之包和类的用法
Feb 23 #Python
You might like
非常好的php目录导航文件代码
2006/10/09 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
Win下如何安装PHP的APC拓展
2013/08/07 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
33种Javascript 表格排序控件收集
2009/12/03 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
python绘制评估优化算法性能的测试函数
2019/06/25 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
2015年安全工作总结范文
2015/04/02 职场文书
入党申请书格式
2019/06/20 职场文书
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题