给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
刚开始想的是根据移动个数找出新头,新尾,直接链接。后面发现环形链表可以少用很多变量记录节点前驱与后驱。
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k)
{
//不符合条件或者节点只有一个
if (head == NULL || head->next == NULL || k == 0)
{
return head;
}
//记录链表元素个数,找出尾节点
ListNode* temp = head;
int num = 1;
while (temp->next != NULL)
{
temp = temp->next;
num++;
}
//k大于元素个数时,只需要处理余数部分
k = k % num;
if (k == 0)
{
return head;
}
//将单链表连接成环状列表
temp->next = head;
//根据右移次数,在对应位置切断环装链表,返回新的表头
temp = head;
for (int i = 1; i < (num - k); i++)
{
temp = temp->next;
}
ListNode* res = temp->next;
//切段环装链表
temp->next = NULL;
return res;
}
};