给你一个链表的头节点?head
?,旋转链表,将链表每个节点向右移动?k
?个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4 输出:[2,0,1]
这个很像对数组进行旋转。
数组的解法:先输出后半段,再输出前半段。
这道题解法:先把链表切开,然后再拼接到一起。切开的时候,要记得切开处左边和右边的结点。
?
// 思路:断开、连接
// 移动几位,就断开后面的几个结点。把它连到开头的位置。
class Solution {
public:
int getLength(ListNode* head){
int len = 0;
while(head){
len++;
head = head->next;
}
return len;
}
ListNode* rotateRight(ListNode* head, int k) {
if(!head){
return head;
}
int len = getLength(head);
k %= len;
if(k == 0){
return head;
}
// 找断开链表的左边结点
ListNode* left = head;
for(int i = 0; i < len - k - 1; i++){
left = left->next;
}
// 子链表的开始结点
ListNode* begin = left->next;
// 找到最后一个结点
ListNode* last = head;
while(last->next){
last = last->next;
}
// 拼接
last->next = head;
left->next = nullptr;
return begin;
}
};