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实现简单购物商城
May 21 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
PyTorch学习笔记之回归实战
May 28 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
python区分不同数据类型的方法
Oct 14 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
Python如何把多个PDF文件合并代码实例
Feb 13 Python
python 命名规范知识点汇总
Feb 14 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
Apr 15 Python
Python多线程thread及模块使用实例
Apr 28 Python
Python爬虫工具requests-html使用解析
Apr 29 Python
python实现图片转字符画
Feb 19 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 上传功能实例代码
2010/04/13 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
php 访问oracle 存储过程实例详解
2017/01/08 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
Google韩国首页图标动画效果
2007/08/26 Javascript
jQuery Ajax之load()方法
2009/10/12 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
python client使用http post 到server端的代码
2013/02/10 Python
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
python访问抓取网页常用命令总结
2017/04/11 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
Python读取YUV文件,并显示的方法
2018/12/04 Python
Python离线安装PIL 模块的方法
2019/01/08 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
志愿者爱心公益活动策划方案
2014/09/15 职场文书
个人委托书范本汇总
2014/10/01 职场文书
详解MySQL集群搭建
2021/05/26 MySQL
SpringBoot详解执行过程
2022/07/15 Java/Android