极市导读
本文介绍一道来自互联网大厂(字节、腾讯、微软等) 面试题 Leetcode 61. 旋转链表,提供虚拟头节点 + 双指针的解题思路,采用动图的方式进行层层剖析,供大家参考,希望对大家无论是刷题还是面试都有所帮助。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
描述
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
思考
考虑以下几种情况:
特殊情况
一般情况
思路
举栗
以链表 1->2->3->4->5,k = 2 为栗,如下图示。
采用 双指针 中的 快慢指针 。
本题设置 虚拟头节点 的作用是找到 新链表的头节点和尾节点。通过 快慢指针 去寻找。
ListNode* rotateRight(ListNode* head, int k) {
/* 特殊情况判断 */
if (head == nullptr || head->next == nullptr || k == 0) {
return head;
}
/* 增加虚拟头节点 */
ListNode* dummy = new ListNode(0);
dummy->next = head;
/* 获取链表长度 */
int len = 0;
for (ListNode* node = head; node != nullptr; node = node->next) {
len++;
}
k %= len;
/* 判断 k 是否是 len 的整数倍 */
if (k == 0) {
return head;
}
/* 获取新链表的头尾节点 */
ListNode *fast = dummy, *slow = dummy;
for (int i = 0; i < k; ++i) {
fast = fast->next;
}
while (fast->next != nullptr) {
fast = fast->next;
slow = slow->next;
}
fast->next = head;
head = slow->next;
slow->next = nullptr;
/* 释放虚拟头节点 */
delete dummy;
return head;
}
ListNode rotateRight(ListNode head, int k) {
if (k == 0 || head == null || head.next == null) {
return head;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
int len = 0;
for (ListNode node = head; node != null; node = node.next) {
len++;
}
k %= len;
if (k == 0) {
return head;
}
ListNode fast = dummy, slow = dummy;
for (int i = 0; i < k; ++i) {
fast = fast.next;
}
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
fast.next = head;
head = slow.next;
slow.next = null;
return head;
}
如果觉得有用,就请分享到朋友圈吧!
公众号后台回复“transformer”获取最新Transformer综述论文下载~
# CV技术社群邀请函 #
备注:姓名-学校/公司-研究方向-城市(如:小极-北大-目标检测-深圳)
即可申请加入极市目标检测/图像分割/工业检测/人脸/医学影像/3D/SLAM/自动驾驶/超分辨率/姿态估计/ReID/GAN/图像增强/OCR/视频理解等技术交流群
每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企视觉开发者互动交流~