这个题很有意思,看题目可以想到利用循环链表,将链表构成一个环后,旋转一定角度后,然后再拆开环,就可以得到新的链表
这里需要注意的就是k值和链表长度的关系,我们可以将环看做钟表,链表长度n就是这个钟表的最大刻度,k值是指针走过的刻度,k值可以比n小,也可以比n大,因为钟表环形循环的特点,指针可能已经绕了钟表好几周,这几周可以完全省略掉,只取余数k % n就是指针走过的有效刻度。
我们如何得到新的头结点呢,联想到钟表,我们假设原来头结点在0刻度上,旋转后,原来 -k%n 刻度来到了0刻度的位置上,只要取链表头结点前面k%n个位置的结点就可以了,但是我们显然不能回退链表,这是个单链表,我们可以利用链表循环的特点,取之后 n - k % n 个位置。找到新的头结点后,我们再想办法找到它前面的节点就是新的尾结点。
思路清楚后,我不假思索,代码一气呵成,没有改动和debug直接贴到leetcode上就AC了,瞬间成就感爆棚啊!
ListNode* rotateRight(ListNode* head, int k) { if (head == nullptr) return head; ListNode *cur = head; int num = 1; while (cur->next != nullptr) { cur = cur->next; num++; } cur->next = head; int gap = num - k % num; ListNode *tail = nullptr; while (gap--) { tail = head; head = head->next; } tail->next = nullptr; return head; }