Leetcode 61 旋转链表【链表】

本题是稍有难度的链表题。
Leetcode 61 旋转链表【链表】_第1张图片
能想出这种方法的是真大佬,太巧妙了
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             
                

你可能感兴趣的:(Leetcode刷题)