给定一个单项链表的头节点head,并给定旋转次数n,将链表每个节点向左旋转n个位置。示例n>=0,输入(1,2,3,4,5),3输出(4,5,1,2,3)。请使用c++代码实现
时间: 2024-10-21 09:08:01 浏览: 13
在C++中,你可以通过两个指针法来解决这个问题。首先创建两个指针`prev`和`curr`,初始化为`nullptr`和`head`。然后进行`n`次迭代:
```cpp
ListNode* rotateList(ListNode* head, int n) {
if (!head || !n) return head; // 如果链表为空或者旋转次数为0,直接返回
ListNode *slow = head;
ListNode *fast = head;
// 找到链表的实际长度
for (int i = 0; i < n % LinkedListLength(head); ++i) {
fast = fast->next;
}
// 如果n是链表长度的整数倍,则无需旋转,直接返回原链表
if (!fast->next) return head;
// 分离链表
while (fast->next != slow) {
fast = fast->next;
slow = slow->next;
}
// 真正的旋转部分
ListNode *newHead = slow->next;
slow->next = nullptr; // 断开旧链表
fast = head;
// 将新链表连接回旧链表
while (fast->next) {
fast = fast->next;
slow = slow->next;
}
slow->next = newHead;
return newHead;
}
// 获取链表长度函数(仅适用于已知长度的情况)
int LinkedListLength(ListNode* head) {
int count = 0;
while (head) {
head = head->next;
count++;
}
return count;
}
// 结构体定义(假设链表节点包含数据和指向下一个节点的指针)
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
```
这个函数首先找到链表的实际长度,然后找到需要断开的地方并分离链表,最后将新链表连接到旧链表的剩余部分。
阅读全文