C++ 程序 将链表中从位置 M 到位置 N 的子列表向右旋转 K 次
给定一个链表和两个位置 ‘m’ 和 ‘n’。任务是将位置 m 到 n 的子列表向右旋转 k 次。
示例:
输入: list = 1->2->3->4->5->6, m = 2, n = 5, k = 2
输出: 1->4->5->2->3->6 将子列表 2 3 4 5 向右旋转 2 次,然后修改后的列表为:1 4 5 2 3 6
输入: list = 20->45->32->34->22->28, m = 3, n = 6, k = 3
输出: 20->45->34->22->28->32 将子列表 32 34 22 28 向右旋转 3 次,然后修改后的列表为:20 45 34 22 28 32
方法: 要将给定的子列表从 m 到 n 的元素向右旋转,将列表从 (n-k+1) th 到 n th 节点移动到子列表的开始处以结束旋转。如果 k 大于子列表的大小,则将其对子列表的大小取模。因此,通过指针和计数器遍历列表,并保存 (m-1) th 节点,稍后使其指向 (n-k+1) th 节点,并将 (n-k+1) th 节点带到子列表的开始(前面)。类似地,我们将保存 m th 节点,稍后使 n th 节点指向它。为了保持其余列表不变,我们将使 (n-k) th 节点指向 n 的下一个节点(可能为空)。最后,我们将得到 k 次右旋转的子列表。下面是上述方法的实现:
输出:
时间复杂度 :O(n),其中n为给定链表中的节点数
辅助空间: O(1)