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;
    }
};
相关推荐
加农炮手Jinx33 分钟前
LeetCode 146. LRU Cache 题解
算法·leetcode·力扣
Rabitebla34 分钟前
C++ 和 C 语言实现 Stack 对比
c语言·数据结构·c++·算法·排序算法
加农炮手Jinx34 分钟前
LeetCode 128. Longest Consecutive Sequence 题解
算法·leetcode·力扣
旖-旎35 分钟前
递归(汉诺塔问题)(1)
c++·学习·算法·leetcode·深度优先·递归
深邃-36 分钟前
【数据结构与算法】-顺序表链表经典算法
java·c语言·数据结构·c++·算法·链表·html5
努力学习的小廉37 分钟前
我爱学算法之—— 前缀和(上)
c++·算法
JAVA学习通37 分钟前
励志从零打造LeetCode平台之C端竞赛列表
java·vscode·leetcode·docker·状态模式
AC178037 分钟前
深入浅出 PID 算法:原理、实现与应用实战
人工智能·算法·机器学习
就爱学编程37 分钟前
惊叹数据结构之美,品味排序算法之妙:对计排、桶排的详细介绍
数据结构·算法·排序算法
啊我不会诶39 分钟前
2025CCPC福建邀请赛补题
算法·深度优先