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 相关文章推荐
pycharm 使用心得(一)安装和首次使用
Jun 05 Python
python实现带声音的摩斯码翻译实现方法
May 20 Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 Python
python机器学习理论与实战(六)支持向量机
Jan 19 Python
python DataFrame 修改列的顺序实例
Apr 10 Python
python用fsolve、leastsq对非线性方程组求解
Dec 15 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
python分数表示方式和写法
Jun 26 Python
django自带调试服务器的使用详解
Aug 29 Python
Django框架之中间件MiddleWare的实现
Dec 30 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
May 13 Python
python基于openpyxl生成excel文件
Dec 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调用三种数据库的方法(1)
2006/10/09 PHP
?算你??的 PHP 程式大小
2006/12/06 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
Wireshark基本介绍和学习TCP三次握手
2016/08/15 Javascript
微信JS接口大全
2016/08/25 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
原生JS实现不断变化的标签
2017/05/22 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
python中zip和unzip数据的方法
2015/05/27 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
详解python中的Turtle函数库
2018/11/19 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
Python实现快速排序的方法详解
2019/10/25 Python
解决python 读取 log日志的编码问题
2019/12/24 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
Python列表解析操作实例总结
2020/02/26 Python
python利用opencv实现颜色检测
2021/02/23 Python
伊利莎白雅顿官网:Elizabeth Arden
2016/10/10 全球购物
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
施工安全汇报材料
2014/08/17 职场文书
民主评议党员总结
2014/10/20 职场文书
小学总务工作总结
2015/08/13 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
Java数组详细介绍及相关工具类
2022/04/14 Java/Android