题目大意
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
解题思路
由于链表在不断旋转,因此若k大于链表长度,则对k取余。
找到要旋转的节点的前一个节点,令其next指针指向空,然后链表尾部的节点指向头结点即可,返回要旋转的节点。
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (!head)
return head;
//计算链表长度
int length = 0;
ListNode * tmp = head;
while (tmp){
tmp = tmp->next;
++length;
}
k %= length;
if (k == 0)
return head;
//找到旋转节点的上一个节点
tmp = head;
for (int i = 0; i < length - k - 1; ++i)
tmp = tmp->next;
ListNode * res = tmp->next;
tmp->next = nullptr;
//找到尾节点,尾节点指向头结点即可
tmp = res;
while (tmp->next)
tmp = tmp->next;
tmp->next = head;
return res;
}