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的pandas框架操作Excel文件中的数据教程
Mar 31 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
Python入门_条件控制(详解)
May 16 Python
python使用fork实现守护进程的方法
Nov 16 Python
python的socket编程入门
Jan 29 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
使用python对excle和json互相转换的示例
Oct 23 Python
python cv2在验证码识别中应用实例解析
Dec 25 Python
基于PyTorch的permute和reshape/view的区别介绍
Jun 18 Python
python使用ctypes库调用DLL动态链接库
Oct 22 Python
scrapy头部修改的方法详解
Dec 06 Python
详解Go语言运用广度优先搜索走迷宫
Jun 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
php中的一个中文字符串截取函数
2007/02/14 PHP
laravel 使用auth编写登录的方法
2019/09/30 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
2014/12/16 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
vue组件实例解析
2017/01/10 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
node实现爬虫的几种简易方式
2019/08/22 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
python数据结构之图的实现方法
2015/07/08 Python
python开发环境PyScripter中文乱码问题解决方案
2016/09/11 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
施华洛世奇天猫官方旗舰店:SWAROVSKI
2017/04/17 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
应届医学毕业生求职信分享
2013/12/02 职场文书
公司请假条格式
2014/04/11 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
医院护士工作检讨书
2014/10/26 职场文书
运动会100米加油稿
2015/07/21 职场文书
社区宣传标语口号
2015/12/26 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书
详解Python中__new__方法的作用
2022/03/31 Python