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 排列组合之itertools
Mar 20 Python
Python从MP3文件获取id3的方法
Jun 15 Python
分析python切片原理和方法
Dec 19 Python
java中两个byte数组实现合并的示例
May 09 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 Python
PyTorch预训练的实现
Sep 18 Python
Python selenium的基本使用方法分析
Dec 21 Python
Python使用docx模块实现刷题功能代码
Feb 13 Python
numpy的Fancy Indexing和array比较详解
Jun 11 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
Jun 17 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 Python
python实现剪贴板的操作
Jul 01 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
VOLVO车载收音机
2021/03/02 无线电
?繁体转换的class
2006/10/09 PHP
用jquery来定位
2007/02/20 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
python中list列表的高级函数
2016/05/17 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
图解Python变量与赋值
2018/04/03 Python
python3中zip()函数使用详解
2018/06/29 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
python 计算概率密度、累计分布、逆函数的例子
2020/02/25 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
计算机专业自我鉴定
2013/10/15 职场文书
医护人员英文求职信范文
2013/11/26 职场文书
《听鱼说话》教学反思
2014/02/15 职场文书
创新社会管理心得体会
2014/09/12 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
婚姻出轨保证书
2015/05/08 职场文书
党支部考察鉴定意见
2015/06/02 职场文书
交通安全教育心得体会
2016/01/15 职场文书
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript