📅  最后修改于: 2023-12-03 15:12:32.547000             🧑  作者: Mango
本文介绍一种 C++ 实现链表顺时针旋转的方法。本方法根据用户输入的参数 k,将链表中的元素依次向右移动 k 个位置。本方法时空复杂度均为 O(n),适用于链表元素个数较少的情况。
本程序的实现思路如下:
根据以上思路,我们可以实现以下代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (head == NULL) return head;
ListNode* tail = head;
int n = 1; // 计算链表元素个数及尾节点位置
while (tail->next != NULL) {
tail = tail->next;
n++;
}
k = k % n; // 计算实际需要右移的距离
if (k == 0) return head; // 特判 k == 0 的情况
tail->next = head; // 将尾节点连接到头节点
ListNode* new_head = head;
// 找到新的头节点
for (int i = 0; i < n - k - 1; i++) {
new_head = new_head->next;
}
ListNode* next_head = new_head->next;
new_head->next = NULL; // 断开环形链表
return next_head;
}
};
本程序的时间复杂度为 O(n),其中 n 为链表元素个数;空间复杂度为 O(1)。
本程序实现了 C++ 链表顺时针旋转的功能,适用于链表元素个数较少的情况。该程序的时间复杂度为 O(n),空间复杂度为 O(1)。