1 链表转环法
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(k == 0 || head == nullptr || head->next == nullptr) return head;//多个特判合到一起
int len = 0;
ListNode* tmp = head;
for(;tmp->next!=nullptr;tmp=tmp->next)
len++;
// 形成闭环
tmp->next = head;
//reduce calculate times
k = k % (len+1);
ListNode* stop = head;
while(k<len) //找到应该断开的位置
{
stop = stop->next;
k++;
}
head=stop->next;
stop->next=nullptr;
return head;
}
};
2 穷举法
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(k == 0 || head == nullptr || head->next == nullptr) return head;//多个特判合到一起
int len = 0;
for(ListNode* tmp = head;tmp->next!=nullptr;tmp=tmp->next;)
len++;
//reduce calculate times
k = k % (len+1);
while(k>0)
{
ListNode* last2 = head; //last 2
ListNode* last1 = head->next; //last 1
while(last1->next != nullptr)
{
last2 = last1;
last1 = last1->next;
}
last1->next = head;
last2->next = nullptr;
head = last1;
k--;
}
return head;
}
};