旋转链表
- 问题描述
- 解题思路
- 代码实现
问题描述
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
 
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
- 链表中节点的数目在范围 [0, 500] 内
- -100 <= Node.val <= 100
- 0 <= k <= 2 * 10^9
解题思路
直接考虑链表的分离与合并,从给定的移动位置出发,找出分割结点的位置,断开链表,最后将分割出来的另一个链表的尾结点连接到原链表的头结点,完成链表的旋转。
代码实现
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if k == 0 or head is None:
            return head
        
        pre = head
        # 计算原链表长度num
        num = 0
        while pre:
            num+=1
            pre = pre.next
            
        # 计算最终的移动距离
        # 如果移动距离大于长度,取余数
        if k>num:
            k = k%num
            print(k)
        # 如果移动距离与长度一致,相对位置不变
        elif num == k:
            return head
        else:
            k = k
        # 移动位置与长度成倍数时,相对位置也不变
        if k == 0:
            return head
        
        # 用于标记链表需要断开的结点位置
        flag = num - k
        cur_head = ListNode(-1)
        middle = head
        while middle:
            if flag == 1:
                # 记录断开的另一个链表头节点
                cur_head.next = middle.next
                # 将原链表断开位置指向空,表示该位置作为移动后的尾结点
                middle.next = None
                break
            middle = middle.next
            flag -= 1
        # 记录新位置的head
        temp = cur_head.next
        while cur_head.next:
            cur_head = cur_head.next
        # 将断开后的另一个链表的尾部连接到原链表的头节点位置
        cur_head.next = head
        return temp
            

















