题目
https://leetcode-cn.com/problems/rotate-list/
题解
NA的原因有几个:
1.这里的head是带有val值的
2.判断是否为空指针时顺序写反了
再讲一下思路:
首先看到数据集中k的范围到了2*10^9,所以我们需要将k进行优化,优化的方法就是k = k mod length
那么我们先求这个链表的长度,方法就是从头遍历链表然后取长度(这里注意一下head其实算其中一个节点,与我所学链表不同)
再者就是对k的优化,优化方法前者提到过,之后k = len-k的操作其实就是将k倒置(下文我将讲什么是倒置)
倒置的原因:
我的思路是将链表从表头开始拼接到表尾,然后删除原有的表头,举个例子
假如k=2,链表为1->2->3->4->5;
那么进行了k = k % len; 和 k = len- k;的操作后,k=3,然后进行循环操作
第一次循环: 链表: 2->3->4->5->1;
第二次循环: 链表: 3->4->5->1->2;
第三次循环: 链表: 4->5->1->2->3;
代码
/**
* Definition for singly-linked list.
* 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) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head==NULL||k==0||head->next==NULL) return head;//报错原因:将head==NULL与head->next=NULL写反了
int len=0;
ListNode* tmp=head;
while(tmp!=NULL){
len++;
tmp=tmp->next;
}
k=k%len;
k=len-k;
ListNode* last=head;
while(last->next!=NULL) last=last->next;
while(k--){
int x=head->val;//报错原因:head也是有val的
ListNode* node=new ListNode(x);
//先把node放在last的后面
last->next=node;
last=last->next;
//再把head后的第一个元素删除
head=head->next;
}
return head;
}
};
作者:fgriver
链接:https://leetcode-cn.com/problems/rotate-list/solution/xuan-zhuan-lian-biao-fgriver-by-fgriver-2t11/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。