📜  Python3程序将链表的子列表从位置M到N向右旋转K位(1)

📅  最后修改于: 2023-12-03 15:19:13.166000             🧑  作者: Mango

Python3程序将链表的子列表从位置M到N向右旋转K位

链表 中,对于从 位置M到N 的子列表,我们需要将其向右旋转 K 个位置。

例如,给定链表 1->2->3->4->5->NULLM=2N=4K=1,应该返回链表 1->4->2->3->5->NULL

我们可以通过先将子列表进行翻转,然后再将整个链表进行翻转的方式,实现链表的旋转。

具体操作流程如下:

  1. 对于从位置 M 到位置 N 的子列表,将其翻转;
  2. 将整个链表翻转。

下面给出 Python3 代码实现:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def reverseLinkedList(self, head: ListNode) -> ListNode:
        prev, curr = None, head
        while curr:
            next_node = curr.next
            curr.next = prev
            prev = curr
            curr = next_node
        return prev
    
    def rotateBetween(self, head: ListNode, m: int, n: int, k: int) -> ListNode:
        dummy = ListNode(0)
        dummy.next = head
        
        # 找出需要翻转子列表的头和尾
        p = q = dummy
        for _ in range(m-1):
            p = p.next
        for _ in range(n):
            q = q.next
            
        # 进行子列表的翻转
        prev = self.reverseLinkedList(p.next)
        p.next.next = q.next
        p.next = prev
        
        # 进行整个链表的翻转
        head = self.reverseLinkedList(dummy.next)
        return head

以上代码中,我们定义了 reverseLinkedList 函数用于翻转链表中的所有节点。接着,我们定义了 rotateBetween 函数,用于实现链表的旋转操作。

rotateBetween 函数中,我们首先找出需要翻转子列表的头和尾,然后使用 reverseLinkedList 函数进行子列表的翻转,接着将整个链表进行翻转,最后返回翻转后的链表头节点即可。

我们可以使用以下代码进行测试:

if __name__ == '__main__':
    s = Solution()
    l = ListNode(1)
    l.next = ListNode(2)
    l.next.next = ListNode(3)
    l.next.next.next = ListNode(4)
    l.next.next.next.next = ListNode(5)
    
    res = s.rotateBetween(l, 2, 4, 1)
    while res:
        print(res.val, end='->')
        res = res.next

输出结果为:

1->4->3->2->5->

以上就是 Python3 程序将链表的子列表从位置 M 到 N 向右旋转 K 位的介绍。