首页 > 其他分享 >剑指offer--链表

剑指offer--链表

时间:2023-07-18 15:23:02浏览次数:31  
标签:结点 cur offer -- clone next 链表 指针

第6题:链表中倒数最后k个结点

  • 题目描述
    输入一个长度为n的链表,设链表中的元素的值为\(a_i\),返回该链表中的第k个结点。
    如果该链表长度小于\(k\),请返回一个长度为0的链表

  • 思路
    双指针

    • step1: 准备一个快指针,从链表头开始,在链表上先走k步。
    • step2: 准备慢指针指向原始链表头,代表当前元素,则慢指针与快指针之间的距离一致都是k。
    • step3:快慢指针同步移动,当快指针到达链表尾部的时候,慢指针正好到了倒数k个元素的位置。
      特点:双指针的初始位置、快慢。
  • 答案

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        ListNode* fast = pHead; 
        ListNode* slow = pHead;
        //快指针先行k步
        for(int i = 0; i < k; i++){  
            if(fast != NULL)
                fast = fast->next;
            //达不到k步说明链表过短,没有倒数k
            else
                return slow = NULL;
        }
        //快慢指针同步,快指针先到底,慢指针指向倒数第k个
        while(fast != NULL){ 
            fast = fast->next;
            slow = slow->next;
        }
        return slow;
    }
};

第7题:复杂链表的复制

  • 题目描述
    输入一个复杂链表(每个结点有结点值,以及两个指针,一个指向下一个结点,另一个特殊指针random指向一个随机结点),请对此链表进行深拷贝。(注意:输出结果中请不要返回参数中的结点引用,否则判题程序会直接返回空)。下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。
  • 思路
    组合链表(双指针)
    正常链表的复制,从头到尾遍历链表,对于每个结点创建新的结点,赋值,并将其连接好就可以了。这道题的不同之处在于我们还要将随机指针连接好,我们创建结点的时候,有可能这个结点创建了,但是它的随机指针指向的结点没有创建,因此创建的时候只能连接指向后面的指针,无法连接随机指针。
    等链表连接好了,再连接随机指针的话,我们又难以找到这个指针指向的位置,因为链表不支持随机访问。但是吧,我们待拷贝的链表可以随机指针访问节点,那么我们不如将拷贝后的每个结点插入到原始链表相应结点之后,这样连接random指针的时候,原始链表random指针后一个元素就是原始链表要找的随机节点,而该节点后一个就是它拷贝出来的新节点,则就可以连上了。
    • step1:遍历链表,对每个结点新建一个拷贝结点,并插入到该节点之后。
    • step2:使用双指针再次遍历链表,两个指针每次移动两步,一个指针遍历原始节点,一个指针遍历拷贝节点,拷贝节点的随机指针跟随原始节点,指向原始节点随机指针的下一位。
    • step3:再次使用双指针遍历链表,每次越过一位后相连,即拆分成两个链表。
  • 答案
public class Solution {
    public RandomListNode Clone(RandomListNode pHead) {
        //空节点直接返回
        if(pHead == null)
            return pHead;
        //添加一个头部节点
        RandomListNode cur = pHead;
        //遍历原始链表,开始复制
        while(cur != null){
            //拷贝节点
            RandomListNode clone = new RandomListNode(cur.label);
            //将新节点插入到被拷贝的节点后
            clone.next = cur.next;
            cur.next = clone;
            cur = clone.next;
        }
        cur = pHead;
        RandomListNode clone = pHead.next;
        RandomListNode res = pHead.next;
        //连接新链表的random节点
        while(cur != null){
            //跟随前一个连接random
            if(cur.random == null)
                clone.random = null;
            else
                //后一个节点才是拷贝的
                clone.random = cur.random.next;
            //cur.next必定不为空
            cur = cur.next.next;
            //检查末尾节点
            if(clone.next != null)
                clone = clone.next.next;
        }
        cur = pHead;
        clone = pHead.next;
        //拆分两个链表
        while(cur != null){
            //cur.next必定不为空
            cur.next = cur.next.next;
            cur = cur.next;
            //检查末尾节点
            if(clone.next != null)
                clone.next = clone.next.next;
            clone = clone.next;
        }
        return res;
    }
}

标签:结点,cur,offer,--,clone,next,链表,指针
From: https://www.cnblogs.com/starkly/p/17561418.html

相关文章

  • antd+vue3 tree-select 组件库 筛选结果不正确的问题
    第一次遇到这种带搜索框的下拉树状列表搜索关键字的时候出现我不想要的结果。我感觉组件它只是搜索一级列表而没有搜索二级列表,然后一节列表把它整个的二级列表带出来了。二级列表里边包含搜索关键字的所有item才是我想要的。相关代码:1<!--页面名称-->2<div......
  • Hive分区/分桶
    分区hive的分区的是针对于数据库的分区,将原来的数据(有规律的数据)分为多个区域,数据和表的信息是不会有变化的,但是会增加namenode的压力分区的目的是提升查询效率,将原来的文件进行多层次的管理分区有三种,静态分区,动态分区,混合分区关键字:partitionedby(字段)分桶分......
  • SSD_核心技术:FTL(2)映射管理
    映射种类根据映射粒度的不同,FTL映射有基于块的映射,有基于页的映射,还有混合映射(HybridMapping)。块映射块映射中,以闪存的块为映射粒度,一个用户逻辑块可以映射到任意一个闪存物理块,但是映射前后,每个页在块中的偏移保持不变。由于映射表只需存储块的映射,因此存储映射表所需空间小......
  • 如何在word中输入定义符号(即等号上面一个三角形)
    方法如下:1、打开word。2、点击插入—》符号—》其它符号。 3、选择字体:MSUIGothic,子集:数字运算符。 4、选择符号,插入,完成。......
  • ffmpeg常用命令
    常用参数:主要参数:-i设定输入流-f设定输出格式-ss开始时间-t时间长度视频参数:-vframes设置要输出的视频帧数-b设定视频码率,默认为200Kbit/s-b:v视频码率-r设定帧速率,默认为25-s设定画面的宽与高-aspect设定画面的比例-vn不处理视频-vcodec设定视频编......
  • 用Python操控斑马打印机的技术总结
    前言由于之前产品打印的标签为人工输入,可能存在信息错误且不适合大批量操作。所以我进行了前期的研究和总结,完成了任务,并这里做下技术总结,方便后面的人进行开发。技术总结斑马打印机的坑官网:http://www.zebra.gd.cn/现在主流的工业打印机都支持二次开发的,要么有自己的一套语......
  • C# 循环对象,获取对象每个属性的名、值、类型
    varcurData=newStudent();foreach(System.Reflection.PropertyInfopincurData.GetType().GetProperties()){if(p.PropertyType.FullName==typeof(decimal).FullName){ls.Add((decimal)p.GetValue(curDat......
  • Eplan是什么软件?学习Eplan软件的几个关键要点
    EPLAN是一款电气计算机辅助设计软件。我是一名Eplan软件的学习者,最近在学习这个专业的电气设计软件时,总结了一些关键要点,希望能与大家分享。  1.熟悉软件界面和功能:首先,我们需要熟悉Eplan软件的界面和各种功能。了解软件的布局、菜单和工具栏,掌握基本的操作方法。可以通过......
  • 图片格式介绍
    BMP,JPG(orJPEG),PNG,和RAW是四种常见的图像文件格式,它们在图像存储和使用方面有一些区别。下面是它们之间的主要区别:1.BMP(Bitmap):BMP是一种无损的图像文件格式,意味着图像质量不会因为文件大小的压缩而降低。它使用像素映射来存储图像数据,可以包含多种颜色和透明度。......
  • 渗透-不被察觉情况下登录目标主机
    介绍文章分为三部分。攻击、防御、收尾攻击:在目标主机发觉不到的情况下与目标同时在一台电脑上操作收尾:清除掉登录后的一切痕迹,就像并未进入过目标主机防御:即结合所有操作检查计算机各项异常,分辨是否已为攻击目标注意:其中演示的目标主机在国外做杀猪盘攻击在登录目标主机之......