描述
本题是力扣的61. 旋转链表
考点
-
链表的裁剪
题解
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
ListNode *dummyHead = new ListNode(-1, head), *slow = dummyHead, *fast = dummyHead, *tmp = head;
int len = 0;
while (tmp != nullptr) {
tmp = tmp->next;
len++;
}
//链表不为空且k求余后不为空,再做操作
if (len && (k %= len)) {
while (k--) fast = fast->next;
while (fast->next != nullptr) {
slow = slow->next;
fast = fast->next;
}
ListNode *subHead = slow->next;
slow->next = fast->next;
fast->next = dummyHead->next;
dummyHead->next = subHead;
}
return dummyHead->next;
}
};
思路
根据题意,假设链表{1, 2, 3, 4, 5}右移3个单位,很容易想到
故而先求整个链表的长度,然后让K对它取余,就能得到需要移动的子链表长度
假设整个链表长度为5,子链表长度也为5,那么子链表就是整体链表,就不需要移动
然后使用快慢指针找到子链表的dummyHead、头节点和尾节点后,更改位置即可
当然,你也可以把链表连接成环,同样使用快慢指针找到子链表的dummyHead与头节点并断开形成新链表,时间复杂度是一样的,你可以尝试一下~
更多
恭喜你完成本题!
你可以选择继续下一题,或移步至仓库开始更多类型的挑战:https://fi3wey.github.io/
仓库内包含了更多经典案例的逻辑剖析与实现细节,助你在算法的学习之旅上一往无前!
看官若还满意,还请Star一下哟~
关注公众号峰狂算法
,获取最新的刷题指导呀~