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 splitlines使用技巧
Sep 06 Python
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
Python匹配中文的正则表达式
May 11 Python
运动检测ViBe算法python实现代码
Jan 09 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
python计算日期之间的放假日期
Jun 05 Python
对Python 3.5拼接列表的新语法详解
Nov 08 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
python从子线程中获得返回值的方法
Jan 30 Python
对PyTorch中inplace字段的全面理解
May 22 Python
Pytorch中Softmax和LogSoftmax的使用详解
Jun 05 Python
python字符串的一些常见实用操作
Apr 06 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 var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
为开发者准备的10款最好的jQuery日历插件
2014/02/04 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
python二进制文件的转译详解
2019/07/03 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
pytorch 模型可视化的例子
2019/08/17 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
python实现画循环圆
2019/11/23 Python
基于python的列表list和集合set操作
2019/11/24 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
UNIX文件类型
2013/08/29 面试题
应届生船舶驾驶求职信
2013/10/19 职场文书
银行实习生的自我评价
2014/01/13 职场文书
八一建军节感言
2014/02/28 职场文书
廉洁使者实施方案
2014/03/29 职场文书
暑期社会实践证明书
2014/11/17 职场文书
网络营销计划书
2015/01/17 职场文书
2016年助残日旅游活动总结
2016/04/01 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL