Python数据结构之旋转链表

题目描述:给定一个链表,旋转链表,使得每个节点向右移动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. 在前驱之后将链表断开,移动后半部分

代码如下:


  1. # Definition for singly-linked list.  
  2. # class ListNode:  
  3. #   def __init__(self, x):  
  4. #     self.val = x  
  5. #     self.next = None  
  6.    
  7. class Solution:  
  8.   # @param head: the list  
  9.   # @param k: rotate to the right k places  
  10.   # @return: the list after rotation  
  11.   def rotateRight(self, head, k):  
  12.     if head is None:  
  13.       return head  
  14.     cur = head  
  15.     count = 1 
  16.     # 计算链表长度  
  17.     while cur.next:  
  18.       curcur = cur.next 
  19.       count += 1 
  20.     # 为节省代码量,这里是一个很有技巧的处理:用尾节点链接头结点  
  21.     cur.next = head  
  22.     # 此处,k为cur从尾节点到要断开部分的前驱需走的步数  
  23.     k = count - k % count  
  24.     # 找到前驱  
  25.     while k != 0:  
  26.       curcur = cur.next 
  27.       k -= 1 
  28.     # 断开  
  29.     head = cur.next 
  30.     cur.next = None 
  31.     # 因为首尾已经相连,所以直接返回前驱后面的那个节点即可,此处引用为head  
  32.     return head  
  33.     # write your code here  

需要注意的是21行首尾相连的技巧,这大大节省了我们的代码量,其实,就按之前思路中所描述的一步步来,也没问题。但是这个技巧确实很棒,值得学习。具体的细节我写在了代码注释里。

作者:佚名

来源:51CTO

时间: 2024-09-15 09:10:25

Python数据结构之旋转链表的相关文章

python数据结构树和二叉树简介_python

一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树的递归定义:树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:(1)有且仅有一个特定的称为根(Root)的结点:(2)其余的结点可分为m(m≥0)个互不相交的子集Tl,T2,-,Tm,其中每个子集本身又是一棵树,并称其为根的子树(Subree). 二.二叉树的定义 二叉树是由n(n≥0)个结点组成的有限集合.每个结点最多有两个子树的有序树

数据结构模版----单链表实现方式总结

数据结构模版----单链表实现方式总结 前面我们提供了四种方式实现的单链表,有带头结点的不带头结点的,而单链表的结构体定义也有两种方式,那么这些实现方式,到底有什么区别呢,为什么会出现这么多种实现方式呢,下面我们就来细细体会 一 单链表结构体的实现区别 首先我们对比一下,单链表结构体 不同方式的单链表实现时,链表结点的实现是相同的,不同之处在于单链表结构体的实现上 单链表结构体的实现 [cpp] view plain copy print? typedef int ElemType;      

python实现:删除链表中等于给定值val的所有节点.求代码学习

问题描述 python实现:删除链表中等于给定值val的所有节点.求代码学习 例如:给出链表 1->2->3->3->4->5->3, 和 val = 3, 需要返回删除3之后的链表:1->2->4->5. 解决方案 python怎么考虑链表,是用类来实现链表节点吗? 如果不是,就简单了. def remove(arr): #arr=[1,2,3,3,4,5,3] arr_len = len(arr) for i in range(0,arr_len)

【数据结构2】链表

1单链表 1结点定义 2头插法建立单链表 3尾插法建立单链表 4按序号查找表结点 5按值查找表结点 6插入结点操作 7删除结点操作 8合并有序链表 2循环双链表 1结点定义 2插入和删除操作 3循环单链表 4带尾指针的循环单链表 5静态链表 由于顺序表的插入和删除操作需要移动大量元素,影响了效率.链式存储不要求逻辑上相邻的两个元素在物理位置上也相邻,而是通过"链"建立起数据元素的逻辑关系.因此,在链表的插入和删除不需要移动元素,只需修改指针. 链式存储的线性表称为链表.其中每个结点(N

Python数据结构

前言 Python作为一种弱类型编程语言,其数据类型较之于C/C++无论是在数据的存储还是调用都有着很大的区别.其特有的字典类型更是一个非常经典且功能强大的数据类型.下面一起来学习Python的数据类型,期间也会穿插一些Python的实用技巧. 软件环境 系统  Ubuntukylin 14.04 软件  Python 4.7.6 IPython 4.0.0 Python数据结构树状图 基本数据类型  数值型  – 整型  – 浮点型  – 复数 布尔型 字符型 组合数据类型  序列  – 列表

python数据结构list的extend与append的差别

样例: 01 >>> li = ['a', 'b', 'c'] 02 >>> li.extend(['d', 'e', 'f']) 03 >>> li 04 ['a', 'b', 'c', 'd', 'e', 'f'] 05 >>> len(li)                    06 6 07 >>> li[-1] 08 'f' 09 >>> li = ['a', 'b', 'c'] 10

数据结构实验之链表六:有序链表的建立

数据结构实验之链表六:有序链表的建立 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 输入N个无序的整数,建立一个有序链表,链表中的结点按照数值非降序排列,输出该有序链表. Input 第一行输入整数个数N: 第二行输入N个无序的整数. Output 依次输出有序链表的结点值. Example Input 6 33 6 22 9 44 5 Example Output 5 6 9 22 33 44 Code realiza

数据结构实验之链表一:顺序建立链表(构造函数)

数据结构实验之链表一:顺序建立链表 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据. Input 第一行输入整数的个数N: 第二行依次输入每个整数. Output 输出这组整数. Example Input 8 12 56 4 6 55 15 33 62 Example Output 12 56 4 6 55 15 33 62 Code rea

数据结构实验之链表二:逆序建立链表

数据结构实验之链表二:逆序建立链表 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 输入整数个数N,再输入N个整数,按照这些整数输入的相反顺序建立单链表,并依次遍历输出单链表的数据. Input 第一行输入整数N;: 第二行依次输入N个整数,逆序建立单链表. Output 依次输出单链表所存放的数据. Example Input 10 11 3 5 27 9 12 43 16 84 22 Example Output 22