Leetcode 61 旋转链表【链表】

本题是稍有难度的链表题。
在这里插入图片描述
能想出这种方法的是真大佬,太巧妙了
1.思路
1)计算链表长度
2)计算新链表起始节点

解题步骤
1)边界检查——k=0或者空链表
2)辅助节点p
3)计算链表长度
4)链表成环
5)计算step,确定新的头节点
6)辅助头节点指向新的头节点
7)打开成环的链

p先在头部,再到尾部,再连成环指向头部,再指向旋转后的头部(p本身位置在链表的尾部,p.next是新头部)。

精妙之处在于:
1)先求出len的同时将链成环;
2)然后求step确定头节点;
3)然后打开成环的链。
4)p永远是前一个,除了列表的前进,一般用p.next去被赋值

2.代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def rotateRight(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        if k == 0 or head == None:    #考虑特殊情况,k=0或者空链表
            return head
        
        len = 0
        dummy = ListNode(0)           #创建辅助头节点(哑节点)
        dummy.next = head
        p = dummy                     #辅助节点p
        
        while p.next:                 #计算链表长度
            len += 1
            p = p.next
            
        p.next = dummy.next           #将链表成环
        
        step = len - k % len          #确定新头节点,重点在于计算出step
        for i in range(step):
            p = p.next
            
        dummy.next = p.next           #辅助头节点(哑节点)指向新的头节点
        p.next = None                 #p打开已经成环的链
       
        return dummy.next             
                

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值