首页 > 其他分享 >旋转链表-灵活运用取模

旋转链表-灵活运用取模

时间:2024-07-18 10:28:09浏览次数:13  
标签:取模 head ListNode struct iter next 链表 灵活运用

题目描述:

个人题解:

        记给定链表的长度为 n,注意到当向右移动的次数 k≥n 时,我们仅需要向右移动 k%n 次即可。因为每 n 次移动都会让链表变为原状。这样我们可以知道,新链表的最后一个节点为原链表的第 (n−1)−(k%n) 个节点(从 0 开始计数)。这样,我们可以先将给定的链表连接成环,然后将指定位置断开。

        具体代码中,我们首先计算出链表的长度 n,并找到该链表的末尾节点,将其与头节点相连。这样就得到了闭合为环的链表。然后我们找到新链表的最后一个节点(即原链表的第 (n−1)−(k%n) 个节点),将当前闭合为环的链表断开,即可得到我们所需要的结果。需要注意的是,当链表长度不大于 1,或者 k 为 n 的倍数时,新链表将与原链表相同,我们无需进行任何处理。

代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* rotateRight(struct ListNode* head, int k) {
    if(k == 0 || head == NULL || head->next == NULL)
        return head;
    int n = 1;
    struct ListNode* iter = head;
    while(iter->next)
    {
        iter = iter->next;
        n++;
    }
    if(k % n == 0)
        return head;
    else
    {
        iter->next = head;
        for(int i=0;i<n-k%n;i++)
        {
            iter = iter->next;
        }
    }
    struct ListNode* newhead = iter->next;
    iter->next = NULL;
    return newhead;
}

复杂度分析:

时间复杂度:O(n),最坏情况下,我们需要遍历该链表两次。

空间复杂度:O(1),我们只需要常数的空间存储若干变量。

标签:取模,head,ListNode,struct,iter,next,链表,灵活运用
From: https://blog.csdn.net/qq_45031559/article/details/140426040

相关文章

  • 数据结构之细说链表
    1.1顺序表的问题以及思考经过上一篇顺序表的学习,我们知道顺序表还是有很多缺点顺序表的缺点:1.中间/头部的插入删除,实际复杂度为O(N)2.增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗3.扩容一般是呈两倍增长,势必会有一定的空间浪费。例如当前空间的容量是100,满了......
  • 数据结构——双链表与静态链表
    一、双链表1、定义 双链表:上一篇提到单链表,其实有一个弊端,就是只能单向读取,很笨重并且只能从头指针开始读取,而双链表是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点......
  • LeetCode-环形链表、环形链表 II
    一、环形链表.-力扣(LeetCode)判断是否有环,使用快慢指针,开始时都指向头节点,快指针每次走两部,慢指针每次走一步,如果在走的过程中,慢指针和快指针相同(也就是快指针和慢指针指向的节点的同)那么就说明这个链表是带环链表;原理: 若是这个链表代换,那么快慢指针一定不会走向NULL;只......
  • 大语言模型无法理解链表 Large Language Models Fails to Understand Chained Table[u
    大模型可以翻转链表,但是只能翻转单个元素链表。一但牵扯到分组操作,就不会了。Case:以K个元素为一组位翻转链表,每一组内部元素顺序不变。ReversethechainedtableingroupofKelements,don'tchangetheorderineachgroup. Handwritten: 1classNode():2......
  • 力扣刷题练习九 【234.回文链表】
    前言链表练习题【234.回文链表】。回顾链表知识,做题练习。一、【234.回文链表】题目阅读给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false......
  • 数据结构之链表
    本文主要介绍链表结构,本人才疏学浅,文中如有出现知识点错误或者代码错误,还请大家多多指正。首先是单向无环链表:在单向无环链表中,每个节点由两部分组成:data和next_node,next_node用于指向下一个节点,而data表示在当前节点中存储的数据。structnode{intdata;node*next_node......
  • 重生之“我打数据结构,真的假的?”--2.单链表
    1.单链表介绍(不带头节点)1.1.链表的概念概念:链表是一种物理存储结构上非连续、非顺序的存储结构,但链表在逻辑上是连续的,顺序的,而数据元素的逻辑顺序是通过链表中的指针连接次序实现的。1.2.链表的结构typedefstructSListnode{ datatypedata; structSListnode*next;......
  • 【C++】链表相关的项目(2.0)
    链表相关的项目1.0需要请点击       ---------------------------------------------------准备工作首先弄几个可能会需要的头文件:#include<stdio.h>#include<stdlib.h>#include<string.h>typedefintADT;//定义自定义数据类型​​因为写的是关于......
  • 代码练习4-合并 k 个升序的链表。
    数据范围:节点总数 0≤......
  • 链表引用——约瑟夫问题
    约瑟夫问题Josephu问题为:设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。提示:用一个不带头结点的循环链表来处理Josephu问题:先构成一个有......