旋转链表问题(python3)

问题描述

给你一个链表的头节点 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
            
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值