题目:
题目链接: https://leetcode-cn.com/problems/rotate-list/
解题思路:
快慢指针
先将快指针向后移动k个节点,同时记录成功遍历的个数num,遍历完成时分两种情况:
- 还没移动到k个节点,链表已遍历完成
- 遍历到了第k个节点
对于case 1,使用更新k = k % (num + 1),获取到新的移动位置,递归调用自己
对于case 2,开始同时移动快慢指针,直到快指针的next为空,退出循环,再按顺序进行如下三步:
- 设置新的链表头new_head为慢指针的next
- 设置慢指针的next为None
- 设置快指针的next为原链表头head
代码实现:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
if k == 0 or not head:
return head
num = 0
head_save = head
fast, slow = head, head
while fast.next and num < k:
num += 1
fast = fast.next
if num < k:
return self.rotateRight(head, k % (num + 1))
while fast.next:
slow = slow.next
fast = fast.next
new_head = slow.next
slow.next = None
fast.next = head
return new_head