📅  最后修改于: 2023-12-03 15:19:13.166000             🧑  作者: Mango
在 链表 中,对于从 位置M到N 的子列表,我们需要将其向右旋转 K 个位置。
例如,给定链表 1->2->3->4->5->NULL
, M=2, N=4, K=1,应该返回链表 1->4->2->3->5->NULL
。
我们可以通过先将子列表进行翻转,然后再将整个链表进行翻转的方式,实现链表的旋转。
具体操作流程如下:
下面给出 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 位的介绍。