提交记录1
执行结果:
解题思路:
- 首先找到k的位置;
- 使k到尾指针的段为首段;
- 然后使首段的next指向head;
- 还有一些特殊情况,比如链表为空、1个节点,或k为len的整数倍,这些情况都直接输出链表,无需变换;
- (好吧我承认,特殊情况是我调bug补上来的,感觉自己的方法笨笨的,再去看看别人的方法)
语言:C++
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
while(!head || !head->next) return head;
ListNode*fast=head;
ListNode*slow=head;
int len=1;
ListNode*cur=head;
while(cur->next){
cur=cur->next;
len++;
}
k=k%len;
while(k==len || k==0) return head;
while(k){
fast=fast->next;
k--;
}
while(fast->next){
fast=fast->next;
slow=slow->next;
}
ListNode*temp=slow;
slow=slow->next;
temp->next=NULL;
fast->next=head;
return slow;
}
};
提交记录2
执行结果:
解题思路:
- 先遍历求得链表总长度count,同时将链表首尾相连;
- 再找到原链表的倒数第k+1个节点,该节点的next就是新链表的头结点;
- (按照思路自己写一遍代码)
语言:C++
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
//无需变化列表
while(!head || !head->next || k==0) return head;
//计算最小k值
int len=1;
ListNode*cur=head;
while(cur->next){
cur=cur->next;
len++;
}
k=k%len;
//使链表首尾相连
cur->next=head;
//找到起始位置
int times=len-k;
while(times){
cur=cur->next;
times--;
}
//将环形链表转换回单链表
ListNode*newhead=cur->next;
cur->next=NULL;
return newhead;
}
};
细节提升
1.环形链表
利用环形链表解决完问题,记得将环形链表转换回单链表,否则内存溢出。