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 相关文章推荐
django1.8使用表单上传文件的实现方法
Nov 04 Python
Python发送http请求解析返回json的实例
Mar 26 Python
Python生成短uuid的方法实例详解
May 29 Python
Python常用爬虫代码总结方便查询
Feb 25 Python
使用selenium模拟登录解决滑块验证问题的实现
May 10 Python
python+rsync精确同步指定格式文件
Aug 29 Python
python读取word 中指定位置的表格及表格数据
Oct 23 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
python连接PostgreSQL过程解析
Feb 09 Python
Python爬虫基础初探selenium
May 31 Python
Python数据类型最全知识总结
May 31 Python
python基础之类方法和静态方法
Oct 24 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侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
PHP时间处理类操作示例
2018/09/05 PHP
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
Javascript如何实现双指控制图片功能
2020/02/25 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
微信公众号token验证失败解决方案
2019/07/22 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
Python 如何反方向迭代一个序列
2020/07/28 Python
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
高山背包:High Sierra
2017/11/23 全球购物
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
护理实习自我鉴定
2013/12/14 职场文书
九年级体育教学反思
2014/01/23 职场文书
入职担保书怎么写
2014/05/12 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
捐款感谢信
2015/01/20 职场文书
全陪导游词开场白
2015/05/29 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python
总结Python常用的魔法方法
2021/05/25 Python
python实现剪贴板的操作
2021/07/01 Python
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers