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中处理字符串的相关的len()方法的使用简介
May 19 Python
python数据结构之图深度优先和广度优先实例详解
Jul 08 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
Python引用传值概念与用法实例小结
Oct 07 Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 Python
python pandas 如何替换某列的一个值
Jun 09 Python
Python并行分布式框架Celery详解
Oct 15 Python
对python中的高效迭代器函数详解
Oct 18 Python
对Python w和w+权限的区别详解
Jan 23 Python
python多线程使用方法实例详解
Dec 30 Python
python 通过exifread读取照片信息
Dec 24 Python
python实现socket简单通信的示例代码
Apr 13 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设计模式之工厂模式实例总结
2017/09/01 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
实例解析jQuery中如何取消后续执行内容
2016/12/01 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
基于jQuery实现的单行公告活动轮播效果
2017/08/23 jQuery
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
Python yield使用方法示例
2013/12/04 Python
python分析apache访问日志脚本分享
2015/02/26 Python
python使用fileinput模块实现逐行读取文件的方法
2015/04/29 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
写给学生的新学期寄语
2014/01/18 职场文书
大学生职业生涯规划范文
2014/01/22 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
宝宝满月宴答谢词
2015/09/30 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
使用Redis实现秒杀功能的简单方法
2021/05/08 Redis
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL