题目描述:
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
输入:head = [0,1,2], k = 4
输出:[2,0,1]
解题思路:
先将链表首尾相连,形成环,然后找到新的头尾结点即可。
struct ListNode* rotateRight(struct ListNode* head, int k){
if(head == NULL || head->next == NULL || k == 0)
return head;
struct ListNode *p;
p=head;
int length=1;
while(p->next) //求表长 同时指针p指向尾结点
{
length++;
p=p->next;
}
int n = length-k%length;
if(n == length) //判断需要移动的次数是不是表长的倍数,如果是,则无需移动
return head;
p->next = head; //形成环
while(n)
{
n--;
p=p->next;
}
//退出循环时 p指向新链表的最后一个结点,p的后继结点就是新的表头结点
struct ListNode *ans = p->next;
p->next = NULL;
return ans;
}