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的Django框架使用
Feb 18 Python
Python AES加密实例解析
Jan 18 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
django js实现部分页面刷新的示例代码
May 28 Python
python单线程文件传输的实例(C/S)
Feb 13 Python
Python给图像添加噪声具体操作
Mar 03 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
python字典排序的方法
Oct 12 Python
150行python代码实现贪吃蛇游戏
Apr 24 Python
python interpolate插值实例
Jul 06 Python
python 如何快速复制序列
Sep 07 Python
python opencv通过按键采集图片源码
May 20 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中文字符串截取函数
2013/11/12 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
AngularJS 所有版本下载地址
2016/09/14 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
在vue中created、mounted等方法使用小结
2020/07/21 Javascript
pandas 选择某几列的方法
2018/07/03 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
详解python中list的使用
2019/03/15 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
Python性能测试工具Locust安装及使用
2020/12/01 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
Linux的主要特性
2014/10/06 面试题
工程现场管理求职自荐信
2013/10/02 职场文书
自荐信模版
2013/10/24 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
考研导师推荐信范文
2015/03/27 职场文书
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers
详解Python常用的魔法方法
2021/06/03 Python
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server