如何将单链表向右旋转k个位置
给定1->2->3->4->5->6->7,k=3,那么旋转后的链表变为5->6->7->1->2->3->4
主要思路:
- 首先找到链表倒数第k+1个结点的尾结点slow和尾结点fast
- 把链表断开为两个子链表,其中后半部分子链表结点的个数为k
- 使原链表的尾结点指向链表的第一个结点
- 使链表的头结点指向原链表倒数第k个结点
这种方法只需要对链表进行一次遍历,因此时间复杂度为O(n),空间复杂度为O(1)
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
void RotateK(ListNode* head, int k)
{
if (head == NULL || head->next == NULL)
{
return;
}
ListNode* slow = head->next;
ListNode* fast = head->next;
for (int i = 0; i < k && fast; ++i) //前移k步
{
fast = fast->next;
}
if (i < k) //判断k是否已超出链表长度
{
return;
}
while (fast->next != NULL)
{
slow = slow->next;
fast = fast->next;
}
ListNode* tmp = slow;
slow = slow->next;
tmp->next = NULL;
fast->next = head->next;
head->next = slow;
}