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中cPickle用法例子分享
Jan 03 Python
浅谈python类属性的访问、设置和删除方法
Jul 25 Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
详解python的数字类型变量与其方法
Nov 20 Python
python使用turtle库与random库绘制雪花
Jun 22 Python
python中从str中提取元素到list以及将list转换为str的方法
Jun 26 Python
python如何以表格形式打印输出的方法示例
Jun 21 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
Python类中方法getitem和getattr详解
Aug 30 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
Python实现列表拼接和去重的三种方式
Jul 02 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/12/09 PHP
mysql 性能的检查和优化方法
2009/06/21 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
php取出数组单个值的方法
2018/03/12 PHP
js实现的复制兼容chrome和IE
2014/04/03 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
python清除指定目录内所有文件中script的方法
2015/06/30 Python
Python中防止sql注入的方法详解
2017/02/25 Python
python之mock模块基本使用方法详解
2019/06/27 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
苹果Mac升级:MacSales.com
2017/11/20 全球购物
allbeauty美国:英国在线美容店
2019/03/11 全球购物
搬家公司的创业计划书
2014/01/01 职场文书
先进个人获奖感言
2014/01/24 职场文书
部门年终奖分配方案
2014/05/07 职场文书
美食节策划方案
2014/05/26 职场文书
金融与证券专业求职信
2014/06/22 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
学生检讨书怎么写
2014/10/09 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
旷课检讨书范文
2015/01/27 职场文书
教代会闭幕词
2015/01/28 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
2016中秋节广告语
2016/01/28 职场文书
MySQL Shell的介绍以及安装
2021/04/24 MySQL