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 中的 else详解
Apr 23 Python
python入门基础之用户输入与模块初认识
Nov 14 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
Apr 28 Python
pandas值替换方法
Jul 10 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
Oct 22 Python
python读取几个G的csv文件方法
Jan 07 Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
python 多维高斯分布数据生成方式
Dec 09 Python
python 命名规范知识点汇总
Feb 14 Python
python中元组的用法整理
Jun 15 Python
python简单验证码识别的实现过程
Jun 20 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
拼音码表的生成
2006/10/09 PHP
劣质的PHP代码简化
2010/02/08 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
2020/04/20 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
vue中监听路由参数的变化及方法
2019/12/06 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
JavaScript实现弹出窗口效果
2020/12/09 Javascript
基于Django contrib Comments 评论模块(详解)
2017/12/08 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
python编写计算器功能
2019/10/25 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
python实现飞机大战项目
2020/03/11 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
什么是servlet链?
2014/07/13 面试题
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
小班开学寄语
2014/04/04 职场文书
校园环保建议书
2014/05/14 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书