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统计cpu利用率的方法
Jun 02 Python
Python语言的面相对象编程方式初步学习
Mar 12 Python
python实现超简单的视频对象提取功能
Jun 04 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
Nov 10 Python
python字符串循环左移
Mar 08 Python
详解python执行shell脚本创建用户及相关操作
Apr 11 Python
python实现自动化上线脚本的示例
Jul 01 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
Aug 09 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
基于selenium及python实现下拉选项定位select
Jul 22 Python
pandas参数设置的实用小技巧
Aug 23 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/06/09 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
php单例模式的简单实现方法
2016/06/10 PHP
php生成mysql的数据字典
2016/07/07 PHP
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
from表单多个按钮提交用onclick跳转不同action
2014/04/24 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
关于Vue组件库开发详析
2018/07/01 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
Mavi牛仔裤美国官网:土耳其著名牛仔品牌
2016/09/24 全球购物
音乐表演专业毕业生求职信
2013/10/14 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
小学生作文评语大全
2014/04/21 职场文书
十佳文明家庭事迹
2014/05/25 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
教师个人总结范文
2015/02/11 职场文书
初级职称评定工作总结
2015/08/13 职场文书
《悬崖边的树》读后感2篇
2019/12/02 职场文书