算法通关村第一关 | 链表青铜挑战笔记

这篇具有很好参考价值的文章主要介绍了算法通关村第一关 | 链表青铜挑战笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 什么是链表?

链表是一种比较简单、很常见的数据结构,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

二、链表的特点

链表是一种比较简单、很常见的数据结构,是线性表(List)的一种,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
1、插入删除效率高:任意位置插入元素和删除元素效率较高,时间复杂度为O(1)
2、灵活度高:链表不需要预先分配固定大小的空间,可以随着元素的增加自动扩容,因此不会出现内存不足的情况。
3、空间分散:在内存中,元素的空间可以在任意地方,空间是分散的,不需要连续。
4、查找效率低:查找数据时效率低,时间复杂度为O(N),因为链表的空间是分散的,所以不具有随机访问性,如要需要访问某个位置的数据,需要从第一个数据开始找起,依次往后遍历,直到找到待查询的位置,故可能在查找某个元素时,时间复杂度达到O(N)。
5、空间利用率高:空间不需要提前指定大小,是动态申请的,根据需求动态的申请和删除内存空间,扩展方便,故空间的利用率较高。

三、 如何构造链表

首先要先理解是怎么构建出链表,我们知道JVM里友栈区和堆区,栈区主要存引用,也就是一个指向实际对象的地址,而堆区存的才是创建的对象。
JVM构建链表图示:
算法通关村第一关 | 链表青铜挑战笔记,java
实现单链表的完整代码:

public class BasicLink {
    public static void main(String[] args) {
        int[] a = {1, 2, 3};
        Node node = getLinked(a);
        System.out.println(node);
    }

    private static Node getLinked(int[] a) {
        Node head = null;
        Node newNode2 = new Node(a[2]);
        Node newNode1 = new Node(a[1]);
        Node newNode0 = new Node(a[0]);
        head = newNode0;
        newNode0.next = newNode1;
        newNode1.next = newNode2;
        return head;

    }
}
class Node {
    public int val;//节点值
    public Node next;//指向下一个节点的引用

    public Node(int var) {
        this.val = var;
    }
}

我们debug一下看一下从head开始next会发现是这样的:
算法通关村第一关 | 链表青铜挑战笔记,java
这就是一个简单的线性访问了,所以链表就是从head开始,逐个开始向后访问,而每次所访问对象的类型都是一样的。

四、遍历链表

对于单链表,不管进行什么操作,一定是从头开始逐个向后访问,所以操作之后是否还能找到表头非常重要。
算法通关村第一关 | 链表青铜挑战笔记,java
代码如下:

 public void printLinkedList(Node head){
        while(head != null){
            System.out.print(head.val + "-");
            head = head.next;
        }
        System.out.println("null");
    }
五、链表的插入

单链表的插入,和数组的插入一样,过程不复杂,但是在编码时会发现处处时坑。单链表的插入操作需要考虑三种情况:首部、中部、尾部。

(1)表头插入

链表表头插入新结点非常简单,其实也就是在一辆火车的头部接入一个新的火车头。容易出错的是经常会忘了head需要重新指向表头。
算法通关村第一关 | 链表青铜挑战笔记,java
代码如下:

Node newNode = new Node();
newNode.val = "新火车头";
newNode.next = head;
head = newNode
(2)中间插入
在中间位置插入,我们必须先遍历找到要插入的位置,然后将当前位置接入到前驱结点和后继结点之间,但是到了该位置之后我们却不能获得前驱结点了,也就无法将结点接入进来了。这就好比一边过河一边拆桥,结果自己也回不去了。
为此,我们要在目标结点的前一个位置停下来,也就是使用cur.next的值而不是cur的值来判断,这是链表最常用的策略。
例如下图中,如果要在7的前面插入,当cur.next = node(7)了就应该停下来,此时cur.val = 15。然后需要给newNode前后接两根线,此时只能先让new.next = node(15).nxet, 然后node(15).next = new,而且顺序还不能错。
想一想为什么不能颠倒顺序?

由于每个节点都只有一个next,因此执行了node(15).next=new之后,节点15和7之间的连线就自动断开了,如下图所示:
算法通关村第一关 | 链表青铜挑战笔记,java

六、结尾插入

表尾插入就比较容易了,我们只要将尾结点指向新结点就行了。
算法通关村第一关 | 链表青铜挑战笔记,java

七、链表删除

删除同样分为删除头部元素,删除中间元素和删除尾部元素。

(1)删除表头结点

只需要将头节点指向下一个节点即可。

if(head == null){ //判断链表是否为空列表
		return;
}
head = head.nxet;

算法通关村第一关 | 链表青铜挑战笔记,java

(2)删除最后一个结点

我们只要找到尾节点的上一个节点,然后将其指向null就可以。例如下图中删除40,其前驱节点是7.遍历的时候需要判断cur.next是否为40,如果是,则只要执行cur.next = null即可,此时节点40变得不可达,最终会被JVM回收掉。
算法通关村第一关 | 链表青铜挑战笔记,java

(3)删除中间结点

删除中间节点时,也会要用cur.next来比较,找到位置后,将cur.next指针的值更新为cur.next.next就可以解决,如下图所示:
算法通关村第一关 | 链表青铜挑战笔记,java文章来源地址https://www.toymoban.com/news/detail-627267.html

到了这里,关于算法通关村第一关 | 链表青铜挑战笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 《算法通关村第一关——链表青铜挑战笔记》

    《算法通关村第一关——链表青铜挑战笔记》

    链表中每个结点内部的“生态环境”。 数据域存储元素的值,指针域存放指针。 示例: c语言构造链表 可分为三步 1.创建头指针。 2.创建头结点,使头指针指向头结点。 3.循环创建结点,并使前一个结点指向当前结点。 1.)创建结点。 2.)使前一个结点指向当前结点。 3.)

    2024年02月15日
    浏览(14)
  • [Go版]算法通关村第一关青铜——链表青铜挑战笔记

    [Go版]算法通关村第一关青铜——链表青铜挑战笔记

    单向链表图示: 双向链表图示: 环形单向链表图示: 环形双向链表图示: 源码地址: GitHub-golang版本 如果是单向的,需要将当前节点 定位到要插入节点的前一个节点 ,否则一旦过了将无法回头找到前一个节点 如果是双向的,将当前节点 定位到要插入节点的前一个节点、

    2024年02月13日
    浏览(9)
  • 【无标题】算法通关村第一关——链表青铜挑战笔记

    【无标题】算法通关村第一关——链表青铜挑战笔记

    算法通关村第一关——链表青铜挑战笔记 C语言是如何构造出链表的 0.定义节点结构 1.建立头指针 2.建立temp指针 3.将节点连起来 3.1 把p指向temp 3.2 设立循环节点a+temp指向a+temp变为a

    2024年02月15日
    浏览(10)
  • 算法通关村第一关——链表青铜挑战笔记(单链表)

    在LeeCode中一般这样创建链表 要注意创建一个变量来遍历,不要把head丢掉了 count position - 1可以方便操作,还能防止下标越界(cur为null)

    2024年02月15日
    浏览(9)
  • [Go版]算法通关村第一关——链表青铜挑战笔记

    [Go版]算法通关村第一关——链表青铜挑战笔记

    单向链表图示: 双向链表图示: 环形单向链表图示: 环形双向链表图示: 源码地址: GitHub-golang版本 如果是单向的,需要将当前节点 定位到要插入节点的前一个节点 ,否则一旦过了将无法回头找到前一个节点 如果是双向的,将当前节点 定位到要插入节点的前一个节点、

    2024年02月15日
    浏览(11)
  • 算法通关存第一关------链表青铜挑战笔记

    如上代码其实就已经构造出了一个链表。 定义一个Node结点类,他有两个属性var,和next。由于next是Node类型,这时候next又会指向同为Node类型的对象,这个对象也拥有var,和next两个属性,由此构造出一个链表。 文章最后会有构造链表实例,完整代码。   2.1 插入结点 在插入链

    2024年02月15日
    浏览(10)
  • 编程导航算法通关村第一关|青铜|链表基础

    编程导航算法通关村第一关|青铜|链表基础

    JVM有栈区和堆区 栈区:存引用,就是指向实际对象的地址。。 堆区:存的是创建的对象。 定义 规范的链表定义 LeetCode算法题中常用 遍历 插入 删除 结点 结构遍历 插入 从头插入 从尾插入 从某个值为key的节点后面插入 删除 删除头结点 删除尾结点 按值删除

    2024年02月15日
    浏览(31)
  • 算法通关村|青铜挑战----链表

    前言:数据结构的基础:创建+增删改查 学习目标:单链表的创建+增删改查,双链表的创建+增删改查 数据域+指针域 数据域:当前节点的元素值 指针域:当前节点保存的下一个节点的元素的地址,其中最后一个元素的指针域指向null 标准的面向对象的节点的定义: LeetCode中节

    2024年02月15日
    浏览(8)
  • 算法通关村第一关——链表经典问题之双指针笔记

    算法通关村第一关——链表经典问题之双指针笔记

    基本结构 1.寻找中间结点 2.寻找倒数第k个元素 3.旋转链表

    2024年02月14日
    浏览(9)
  • 算法通关村第一关——链表经典问题之双指针专题笔记

    我一直觉得双指针是一个非常好用的方法,在链表中可以使用,在数组中依然可以,很灵活。 1. 寻找中间结点         用两个指针 slow 与 fast 一起遍历链表。slow 一次走一步, fast 一次走两步。那么当 fast 到达链表的末尾时,slow 必然位于中间。 2. 寻找倒数第K个元素 在这

    2024年02月15日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包