力扣61.旋转链表
给你一个链表的头节点 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
题目分析
该题给出应该链表,以及应该正整数,要求我们将链表中的节点向前移k个位置,这题我们可以转换思想就会变得很简单。
解题思路
我们可以通过遍历链表,计算出链表的长度,并且将链表首尾连接起来,因为给出的正整数k又可能大于链表的长度n,所以我们需要计算指针在一圈里面需要走多少,所以求得k除n的余数。因为遍历链表后,此时指针位于链表的尾部,如果此时需要向前移俩个单位,我们可以理解为:要把后面的俩个节点移到最前面。则在遍历环的时候,走到这俩个节点前,断开环,则我们可以得到目标链表。
struct ListNode* rotateRight(struct ListNode* head, int k) {if(k == 0 || head == NULL || head->next ==NULL){return head;}int n=1;struct ListNode* cur = head;while(cur->next != NULL) {cur = cur->next;n++;}int add = n - k % n;if(add == n) {return head;}cur->next = head;//连接该链表的首尾while(add--) {cur = cur->next;}struct ListNode* prev = cur->next;cur->next = NULL;return prev;
}
总结
在最近做链表题中我觉得链表题中,应该有以下注意点
- 做题判断有没有特殊情况,比如该题当正整数为0或链表长度为0或1的时候,就无需判断直接返回结果即可,这会简便我们的程序。
- 我们要注意节点的变换和遍历链表的方式,指针的移动,如果这些无法处理好可能会导致死循环。