具体题目描述可以查看leetcode:61. 旋转链表
题目描述:给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
思路:先遍历一次链表,把尾指针指向开头形成环,再到相应位置剪开链表即可。需要注意的是在什么位置剪开,假如移动k步,k比链表长度小的话,需要从开头向下找的是len-k步,假如k比len大,则每多len个长度相当于一步未移动,因此把多的len步排除,最后走的是len - (k-(k/len)*len)步。
/**
* 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)
return NULL;
ListNode *nhead = head;
//首先把链表接成环
int len = 1; //这里是因为下面循环条件是next,需要先探测一步,不能从0开始
while(nhead->next){
nhead = nhead->next;
len ++;
}
nhead->next = head;
ListNode *pre = nhead;
nhead = head;
int step = 0;
if(len>=k) step = len-k;
else{
step = len - (k-(k/len)*len);
}
for(int i = 0;i<step;i++){
nhead = nhead->next;
pre = pre->next;
}
//再剪开环
pre->next = NULL;
return nhead;
}
};