初识链表 向右看齐 2022-10-23 08:13 188阅读 0赞 ### 链表 ### * 链表的原理 * * 链表 * 实现 * 用引用和对象的知识理解 * 链表具体实现 * * 结点的定义 * 链表的创建 * 链表的遍历 * * 遍历每个元素和计算链表中元素个数 * 找到最后一个结点 * 找到倒数第二个结点 * 找到第n个结点 * 找到链表中是否包含某个元素 * 链表的插入和删除 * * * 给定前驱结点后的插入 * 给定前驱结点后的删除 * 头插 * 头删 * 尾插 * 尾删 * 总结: # 链表的原理 # ## 链表 ## 链表——属于线性表,元素与元素之间有相对的顺序,有头部\\尾部,还有当前结点cur,前驱结点prev,后继结点next。 每个结点是为了组织链表而引入的一个结构,出来保存的元素外,还会保存指向下一个结点的引用。 head是一个链表的头结点,通过head我们可以找到所有的结点,目前我们可以用头结点来代表一整条链表。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70] ## 实现 ## 1、结点的定义: class Node { int val;//保存元素 Node next;//指向下一个节点的引用,尾结点的next==null } 2、头结点: Node head=...; //当链表的头结点为null,表示头结点不存在。还可以理解为,没有头结点的链表,即一个空链表。 Node head = null; # 用引用和对象的知识理解 # (结点中有许多.next…看来看去就绕晕了,我们可以借助引用和对象来理解,更好接受) 1 Node P = ...; //p是一条链表中的某个结点 2 Node q = ...; //q是一条链表中的某个结点 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70 1] 在上面的情况下,画图表现变化: 1、p = q; ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70 2] 2、p = q.next; ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70 3] 3、p.next = q; ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70 4] 4、p.next = q.next; ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70 5] 总结: 我们会发现,左边和右边都存在.next,绕着绕着就把人绕晕了,对于这种情况,我们可以把等号左边去找引用,等号右边去找对象。 简单说就是 **左引用,右对象**,这样理解。 # 链表具体实现 # ## 结点的定义 ## class Node { int val;//保存元素 Node next;//指向下一个节点的引用,尾结点的next==null @Override public String toString() { return "Node{" + "val=" + val + '}'; } } ## 链表的创建 ## Node n1 = new Node(); Node n2 = new Node(); Node n3 = new Node(); Node n4 = new Node(); n1.val = 1; n2.val = 2; n3.val = 3; n4.val = 4; n1.next = n2; n2.next = n3; n3.next = n4; n4.next = null; Node head = n1; ## 链表的遍历 ## ### 遍历每个元素和计算链表中元素个数 ### Node head = n1; int count = 0; Node cur = head; while (cur != null) { System.out.println(cur.val); cur = cur.next; count++; } System.out.println(count); ### 找到最后一个结点 ### Node cur = head; while (cur.next != null) { cur = cur.next; } System.out.println(cur.val); } ### 找到倒数第二个结点 ### //找到倒数第二个结点 Node cur = head; while (cur.next.next != null) { cur = cur.next; } System.out.println(cur.val); } ### 找到第n个结点 ### //找到第n个结点 int n = 2; Node ncur = head; for (int i = 1; i < n; i++) { ncur = ncur.next; } System.out.println(ncur.val); ### 找到链表中是否包含某个元素 ### Node cur = head; while (cur != null) { if (cur.val == target) { //找到了 System.out.println("找到了"); } cur = cur.next; } System.out.println("没找到"); # 链表的插入和删除 # ### 给定前驱结点后的插入 ### Node prev = n2; Node node = new Node(); node.val = 6; node.next = prev.next; prev.next = node; ### 给定前驱结点后的删除 ### Node prev = n2; prev.next = prev.next.next; ### 头插 ### Node node=new Node(); node.val=12; node.next=head; head=node; ### 头删 ### //头删 if (head == null) { throw new RuntimeException("链表为空"); } head = head.next; ### 尾插 ### //链表为空,直接插入 if (head == null) { Node node = new Node(); node.val = 1; } //链表不为空 Node last = head; while (last.next != null) { last = last.next; } Node node = new Node(); node.val = 12; last.next = node; ### 尾删 ### //尾删 if (head == null) { throw new RuntimeException("链表为空"); } //链表不为空只有一个节点 if (head.next == null) { head.next=null; } Node last = head; while (last.next.next != null) { last = last.next; } last.next = null; ## 总结: ## 我们发现链表里面有许多的 (.next),左边有,右边也有,有的代表着引用,有的代表着对象。 我们可以把等号左边去找引用,等号右边去找对象。 简单说就是 **左引用,右对象**,这样理解。 对于数据结构的问题,我们真的需要多多的去理解,并且多画图,借助图像理解数据结构的具体逻辑。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70]: /images/20221023/9599d092b9aa422c8b1458bc1f1bb7cb.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70 1]: /images/20221023/21bd1e655f234a4bace4650df3ed614a.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70 2]: /images/20221023/80ad2914d93e4c71b559084018408251.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70 3]: /images/20221023/28fe6991a16446348d1d6ba58a721e05.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70 4]: /images/20221023/4bc08cf5cab3450ab08817d24ce92183.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjE0MjczMQ_size_16_color_FFFFFF_t_70 5]: /images/20221023/d8895c80c2ec475994d03d07863096dc.png
相关 单向链表·初识【c语言】 文章目录 顺序表和链表的优缺点 入门·增删改查【大佬请路过】 增 头插·思路·代码 尾插·思路·代码 ╰+攻爆jí腚メ/ 2024年04月06日 10:32/ 0 赞/ 65 阅读
相关 设计模式初识——责任链模式 一 概述 为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链,当请求发生的时候,可将请求沿着这条链传递,知道有 旧城等待,/ 2022年12月13日 01:41/ 0 赞/ 153 阅读
相关 初识内核链表 前面我们说过如何用C实现通用类型的链表,比如void\的指针,零长数组等。可是小菜鸟毕竟赶不上大师,还是Linux内核巧妙啊,这里面的链表,才是链表中的“奇葩”。 今天药忘吃喽~/ 2022年08月24日 00:45/ 0 赞/ 157 阅读
相关 初识JAVA Java的起源: Java之父:James Gosling 1995年5.23日正式诞生;Java的形象代表图标 :“一杯热气腾腾的咖啡 水深无声/ 2022年08月09日 04:29/ 0 赞/ 355 阅读
相关 初识java 新的学期初识Java,在这一周的Java学习中学习到了两种排序的方法:冒泡法和选择法排序 首先说一下冒泡法 例如一组数据5 9 3 1 6从小到大排列 第一轮 骑猪看日落/ 2022年05月28日 04:55/ 0 赞/ 391 阅读
相关 初识链表 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链 快来打我*/ 2022年05月25日 09:19/ 0 赞/ 152 阅读
相关 初识区块链 1.区块链概念: 区块链是由包含交易信息的区块从后向前有序链接起来的数据结构。 区块被从后向前有序地链接在这个链条里,每个区块都指向前一 桃扇骨/ 2022年05月21日 00:46/ 0 赞/ 155 阅读
相关 初识Java 今天算是从c++里脱身了,进入了Java程序员的行列,虽然之前对Java没有了解过,但是出于对c++编程的理解,除了刚开始对编辑环境以及对Java的语法不太熟悉 女爷i/ 2022年05月20日 09:57/ 0 赞/ 321 阅读
相关 哈希表初识 转载自:[https://www.cnblogs.com/lchzls/p/6714079.html][https_www.cnblogs.com_lchzls_p_67140 骑猪看日落/ 2022年05月13日 04:28/ 0 赞/ 166 阅读
还没有评论,来说两句吧...