视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python数据结构之旋转链表
2020-11-27 14:26:22 责编:小采
文档


题目描述:给定一个链表,旋转链表,使得每个节点向右移动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 数据结构之旋转链表相关文章请关注PHP中文网!

下载本文
显示全文
专题