leetcode61:Rotate List-旋转列表-将列表向右循环移k位

这篇博客介绍了如何通过不同方法解决LeetCode中的旋转链表问题,包括每次循环右移一位的朴素解法,优化后的循环右移找关键点的方法,以及使用快慢指针法。通过具体的例子和代码解释了每种方法的思路和实现,适合初学者学习。
摘要由CSDN通过智能技术生成

一.题目描述-Rotate List

Given a linked list, rotate the list to the right by k places, where k is non-negative.

Example 1:
Input: 1->2->3->4->5->NULL, k = 2
Output: 4->5->1->2->3->NULL
Explanation:
rotate 1 steps to the right: 5->1->2->3->4->NULL
rotate 2 steps to the right: 4->5->1->2->3->NULL
Example 2:
Input: 0->1->2->NULL, k = 4
Output: 2->0->1->NULL
Explanation:
rotate 1 steps to the right: 2->0->1->NULL
rotate 2 steps to the right: 1->2->0->NULL
rotate 3 steps to the right: 0->1->2->NULL
rotate 4 steps to the right: 2->0->1->NULL

原题链接: https://leetcode.com/problems/rotate-list/

二.解题思路

2.1 思路一(Naive)——每次循环右移一位+做k次循环

考虑到要求循环右移k位,那么只需要先编写一个每次移动一位的函数,然后调用k次即可。但是显然这种方法蠢萌蠢萌的,使用后实测发现Time Limit Exceeded。原因是k可能会很大,当len(list)也很长时,总是这样循环遍历效率极低。

2.2 思路二——循环右移k次,找关键中断点,调整头尾指针

  1. 观察发现,当进行循环右移时,找关键点应当是从右往左(也就是从尾到头)查找,以Example1 为例:

    Input: 1->2->3->4->5->NULL, k = 2
    从右往左查找,第2位是’4‘,所以此处’4‘就是新链表的头节点,’3‘是新链表的尾节点,只需要重新调整链表中指针指向即可。
    
  2. 考虑到可能出现k > len(list)的情况,此时只需简单处理,令k = k % len(list)即可解决。

  3. 回顾步骤1和2会发现当前的解决方法是从尾部往头部找关键点,对于单向链表而言,想要实现这一点比较麻烦。所以我们可以使用等价的向左移位来代替向右移位。具体而言向右循环移动** k 次,等价于向左循环移位 len(list)-k **次。向左移位时找关键点只需要就是从头向尾查找,非常方便。

  4. 具体代码-Python3代码:(C++或者java可以轻易套用此思路进行处理)

    class Solution(object
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值