leetcode旋转链表

旋转链表

题目链接:![https://leetcode.cn/problems/rotate-list/description/\]

解题思路

旋转链表,就是从尾节点开始倒着头插。如果把链表头尾相连(变成环),那么无论怎么旋转,链表中节点的相对顺序是没变的,只是头节点发生了变化。所以我们只需要找到新的头节点就可以了,并不需要真的头插。

旋转k次,k的值可能大于链表的长度,这种情况下和旋转k%length次是一样的,所以实际上只需要旋转k%length次。此时第length-k%length处的节点就是旋转之后的尾节点,它的下一个节点就是旋转之后的新头节点,把头尾断开之后链表就旋转完毕了。

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if (head == nullptr || head->next == nullptr || k == 0)
            return head;

        int length = 1;
        ListNode* p = head;
        while (p->next != nullptr) // 统计长度并把链表变成环形
        {
            length++;
            p = p->next;
        }

        int step = length - k % length;
        if (step == length)
            return head;
        p->next = head;

        while (step > 0) {
            p = p->next;
            step--;
        }
        ListNode* new_head = p->next;
        p->next = nullptr;

        return new_head;
    }
};
相关推荐
洛水水2 小时前
【力扣100题】18.随机链表的复制
算法·leetcode·链表
南宫萧幕3 小时前
规则基 EMS 仿真实战:SOC 区间划分与 Simulink 闭环建模全解
算法·matlab·控制
多加点辣也没关系3 小时前
数据结构与算法|第二十三章:高级数据结构
数据结构·算法
hoiii1875 小时前
孤立森林 (Isolation Forest) 快速异常检测系统
算法
c++之路6 小时前
适配器模式(Adapter Pattern)
java·算法·适配器模式
吴声子夜歌7 小时前
Java——接口的细节
java·开发语言·算法
myheartgo-on7 小时前
Java—方 法
java·开发语言·算法·青少年编程
宝贝儿好8 小时前
【LLM】第三章:项目实操案例:智能输入法项目
人工智能·python·深度学习·算法·机器人
雪碧聊技术9 小时前
上午题_算法
算法·软考·软件设计师