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 相关文章推荐
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 Python
Python中函数的参数定义和可变参数用法实例分析
Jun 04 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
对python sklearn one-hot编码详解
Jul 10 Python
python利用pandas将excel文件转换为txt文件的方法
Oct 23 Python
浅谈python图片处理Image和skimage的区别
Aug 04 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
Python双链表原理与实现方法详解
Feb 22 Python
Django框架配置mysql数据库实现过程
Apr 22 Python
Python如何获取文件指定行的内容
May 27 Python
如何学习Python time模块
Jun 03 Python
Django实现任意文件上传(最简单的方法)
Jun 03 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面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
php获取excel文件数据
2017/04/21 PHP
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
ie下jquery.getJSON的缓存问题的处理方法
2013/03/29 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
Angular通过指令动态添加组件问题
2018/07/09 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
Vue实现一个无限加载列表功能
2018/11/13 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
jQuery实现简单评论功能
2020/08/19 jQuery
vue-router 按需加载 component: () => import() 报错的解决
2020/09/22 Javascript
vc6编写python扩展的方法分享
2014/01/17 Python
Python CSV模块使用实例
2015/04/09 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
基于python plotly交互式图表大全
2019/12/07 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
英国DIY汽车维修配件网站:DIY Car Service Parts
2019/08/30 全球购物
母亲节演讲稿范文
2014/01/02 职场文书
草船借箭教学反思
2014/02/03 职场文书
五年级学生评语
2014/04/22 职场文书
大学生新学期计划书
2014/04/28 职场文书
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server