LeetCode-python 61.旋转链表

题目链接
难度: 中等       类型:链表


给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。

示例1

输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL

示例2

输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL

解题思路


1.用快慢指针确定旋转后链表的头节点
若链表的长度为n,让快指针先走k%n步,然后快慢指针同时向前走,直到快指针的next为空,此时慢指针的next为旋转后链表的头节点
2.移花接木
快指针的next指向原链表的头节点head
head指向慢指针的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 not head or not head.next:
            return head
        
        fast, slow = head, head
        # 找到fast的起始节点
        def findStart(fast, k):
            length = 0
            while k>0:
                k -= 1
                length += 1
                fast = fast.next
                if not fast:
                    fast = head                                    
                    k = k % length                    
                    return findStart(fast, k)
            return fast
                   
        fast = findStart(fast, k)
         
        while fast and fast.next:           
            fast = fast.next
            slow = slow.next
   
        fast.next = head
        head = slow.next
        slow.next = None
        return head

你可能感兴趣的:(LeetCode-python 61.旋转链表)