题目:
给你一个链表的头节点 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]
提示:
链表中节点的数目在范围 [0, 500] 内
-100 <= Node.val <= 100
0 <= k <= 2 * 109
分析:
此题并不难,主要运用循环链表来解决。找到在什么地方断开,主要是一个找规律的数学问题(len-k%len),还有一点需要注意是题目给的范围是从0开始,所以一上来要加个异常判断,如果头结点是空直接返回头结点。(否则后面断链表的时候会报空指针错误。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* rotateRight(struct ListNode* head, int k){
if(head==NULL) //注意这里要单独判断
return head;
int len=1; //长度从1开始取,否则报空指针错误
struct ListNode *p;
p=head;
while(p->next!=NULL){ //判断到p->next是否为空,我们要找最后一个结点
p=p->next;
len++;
}
p->next=head; //这里容易报空指针错误(注意前面while的判断条件)
for(int i=0;i<len-k%len;i++){//找到数学规律(可以多画图)
p=p->next;
}
head=p->next;
p->next=NULL; //容易报空指针错误
return head;
}