leetcode专题训练 61. Rotate List

本题所用方法与官方题解方法略有不同,官方题解是先遍历一遍链表,得到链表长度,再将链表末尾指向链表头形成环,再找到合适位置断开链表。我的方法是利用双指针,在得到链表长度的同时,将另一个指针p2指向合适位置(如果k<链表长度),如果k>链表长度,那么就需要在得到链表长度后,再将另一指针p2指向合适位置。在将p2指针指向合适位置后,进行旋转操作即可。具体旋转操作见代码。
(合适位置:结果链表头在原链表中的前一位)

# 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 k == 0:
            return head
        if head == None:
            return head

        # 重新添加链表头
        hea = ListNode(0)
        hea.next = head

        # 计算链表长度,同时将p1移动到链表最后一个元素,利用双指针,将p2移动到合适位置(结果链表头的前一位)
        l = 0 # 链表长度
        p1 = hea
        p2 = hea
        while p1.next != None:
            p1 = p1.next
            l += 1
            if l > k: # 双指针
                p2 = p2.next

        # 如果l<=k则p1到达末尾时p2还在原始链表头,所以此时要特殊处理,使p2到达合适位置
        if l <= k:
            k = k%l
            if k == 0:
                return head
            for i in range(l-k):
                p2 = p2.next
            
        # 旋转操作
        tmp = p2.next
        p2.next = None
        p1.next = hea.next
        hea.next = tmp
        return hea.next
发布了201 篇原创文章 · 获赞 26 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Ema1997/article/details/104078006
今日推荐