题目连题意都说不清楚,坑。。其实题意就是(假设链表的长度为num)当k > num 的时候,k要改变,k = k%num !!!!!!!!
如果k == 0,就是链表旋转0个位置,直接返回链表即可。
思路:经过上面的处理之后,k是小于链表长度的,如果k == 0,直接返回原来的链表即可。否则修改链表的尾部指针指向头结点,然后把倒数第k+1节点的指针域设置为空即可。要找倒数第几个点,可以根据链表的长度从头开始找即可,但是这样太慢了,可以在用一个map容器记录n号位置是哪个节点。比如m[1] = p 表示1号位置是p节点。
class Solution {
public:
map<long long , ListNode*>m;
ListNode *rotateRight(ListNode *head, int k) {
if(head == nullptr || k <= 0)
return head;
ListNode * p = head;
long long num = 0;//记录链表长度
while(p){
num++;
m[num] = p;//记录num号位置的节点
p = p->next;
}
if(k == num)//链表长度等于k直接返回即可
return head;
if(k > num)
k %= num;//取模后的k
if(k == 0)
return head;//k==0 直接返回
long long t = num - k;
m[num]->next = head;//把尾节点修改
m[t]->next = nullptr;//把倒数第k-1个节点修改
return m[t+1];//返回头节点
}
};