首页 > 其他分享 >【code基础】链表问题总结

【code基础】链表问题总结

时间:2022-10-01 11:11:14浏览次数:58  
标签:总结 结点 code 指向 元素 链表 移动 指针

数组和链表的区别

数组:所有元素都连续的存储于一段内存中,且每个元素占用的内存大小相同。

  • 数组具备了通过下标快速访问数据的能力
  • 增加数组容量需要先申请一块新的内存,然后复制原有的元素。如果需要的话,可能还要删除原先的内存。
  • 删除元素时需要移动被删除元素之后的所有元素以保证所有元素是连续的
  • 增加元素时需要移动指定位置及之后的所有元素,然后将新增元素插入到指定位置,如果容量不足的话还需要先进行扩容操作

总结一下数组的优缺点:

  • 优点:可以根据偏移实现快速的随机读写。
  • 缺点:扩容,增删元素极慢。

链表:由若干个结点组成,每个结点包含数据域和指针域。

  • 一般来讲,链表中只会有一个结点的指针域为空,该结点为尾结点。
  • 其他结点的指针域都会存储一个结点的内存地址
  • 链表中也只会有一个结点的内存地址没有存储在其他结点的指针域,该结点称为头结点。

优点: 链表的存储方式使得它可以高效的在指定位置插入与删除,时间复杂度均为 O(1)。
缺点: 无法高效获取长度,无法根据偏移快速访问元素

解决链表问题的常见思路

问题总结:无法高效获取长度,无法根据偏移快速访问元素,是链表的两个劣势。
然而面试的时候经常碰见诸如获取倒数第k个元素,获取中间位置的元素,判断链表是否存在环,判断环的长度等和长度与位置有关的问题。
这些问题都可以通过灵活运用双指针来解决。

  1. 倒数第k个元素问题

设有两个指针 p 和 q,初始时均指向头结点。首先,先让 p 沿着 next 移动 k 次。此时,p 指向第 k+1个结点,q 指向头节点,两个指针的距离为 k 。然后,同时移动 p 和 q,直到 p 指向空,此时 q 即指向倒数第 k 个结点

  1. 获取中间元素的问题

设有两个指针 fast 和 slow,初始时指向头节点。每次移动时,fast向后走两次,slow向后走一次,直到 fast 无法向后走两次。这使得在每轮移动之后。fast 和 slow 的距离就会增加一。设链表有 n 个元素,那么最多移动 n/2 轮。当 n 为奇数时,slow 恰好指向中间结点,当 n 为 偶数时,slow 恰好指向中间两个结点的靠前一个

  1. 是否存在环的问题

当一个链表有环时,快慢指针都会陷入环中进行无限次移动,然后变成了追及问题。想象一下在操场跑步的场景,只要一直跑下去,快的总会追上慢的。当两个指针都进入环后,每轮移动使得慢指针到快指针的距离增加一,同时快指针到慢指针的距离也减少一,只要一直移动下去,快指针总会追上慢指针

  1. 如果存在环,如何判断环的长度呢?

快慢指针相遇后继续移动,直到第二次相遇。两次相遇间的移动次数即为环的长度

标签:总结,结点,code,指向,元素,链表,移动,指针
From: https://www.cnblogs.com/xiaoyu-jane/p/16746927.html

相关文章

  • 2022-2023-1 20221305 《计算机基础与程序设计》第五周学习总结
    2022-2023-120221305《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在......
  • VSCode编写博客插件
    @目录前言MarkdownToolsMarkdownPreviewEnhanced博客园Cnblogs客户端插入图片一键发布前言在编写博客的道路上面,几经波折,以前写博客,都是直接使用CSDN或者博客园在线编......
  • UIKit — 带有 ViewCode 的基本导航层次结构
    UIKit—带有ViewCode的基本导航层次结构创建屏幕层次结构并在它们之间轻松导航当我们实现一个应用程序时,尤其是当它的设计不包含标签栏时,我们希望以某种方式确保用户......
  • LeetCode 无重复字符的最长子串算法题解 All In One
    LeetCode无重复字符的最长子串算法题解AllInOnejs/ts实现无重复字符的最长子串无重复字符的最长子串原理图解滑动窗口"usestrict";/****@authorx......
  • curl: (7)Failed connect to ip:port;Connection timed out returned a non-zero code
    问题现象负责安全测试的同学需要部署洞态IAST,通过java探针的方式附加到应用服务上,在项目下添加了一个Dockerfile文件:FROMprasadlvi/openjdk-11-jreWORKDIR/home......
  • Python基本算法实现及总结归纳
    @目录冒泡排序快速排序插入排序选择排序希尔排序归并排序各个算法的时间复杂度附:二分法冒泡排序这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(......
  • LeetCode160 相交链表
       idea:比较相同信息,首先想到用嵌套for循环解决,方法比较简单,不过时间复杂度高 /** * Definition for singly-linked list. * struct ListNode { *......
  • 第三讲 类与对象 课后总结
    类的定义定义了一组大体上相似的对象。一个类所包含的方法和数据描述一组对象的共同行为和属性。对象则是类的具体化,是类的实例。类通过派生可以有子类,同样也可以有父类......
  • [Oracle] LeetCode 560 Subarray Sum Equals K 思维+Map
    Givenanarrayofintegersnumsandanintegerk,returnthetotalnumberofsubarrayswhosesumequalstok.Asubarrayisacontiguousnon-emptysequenceof......
  • LeetCode 206 反转链表
    给你单链表的头节点head,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出......