找出链表的第一个公共结点 java_结构与算法(03):单向链表和双向链表

6c31b980e083a00243c2e69f28e787c0.png

一、链表简介

1、链表概念

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,节点可以在运行时动态生成,节点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

2、基础特点

内存存储

b0699eab590fbb45d1ea52215898d64a.png

逻辑结构

b6741c9c9a42b3bedf55d5d2ad4e961e.png

特点描述

  • 物理存储上是无序且不连续的;
  • 链表是由多个节点以链式结构组成;
  • 逻辑层面上看形成一个有序的链路结构;

链表结构解决数组存储需要预先知道元素个数的缺陷,可以充分利用内存空间,实现灵活的内存动态管理。

二、单向链表

1、基础描述

1ed1c634bb253f33e41a3d9db07c9851.png

单向链表是链表的一种,其特点是链表的链接方向是单向的,链表的遍历要从头部开始顺序读取;结点构成,head指针指向第一个成为表头结点,终止于最后一个指向NULL的指针。

2、基础操作

添加数据

84111e2789c8296c6955e7ddb1f6c46c.png
  • 初始化head节点,作为链表的头;
  • 修改当前末尾节点的next指针;
  • 新添加的节点房子在链表末尾;

删除数据

ff1f2fcd4d1c8b63227a957e0491c94b.png

遍历找到要删除的节点,把删除节点前个节点的指针指向该删除节点的下个节点;

三、双向链表

1、概念描述

a1509f546a669fb13332fe66e197363d.png

双向链表也叫双链表,是链表的一种,链表的每个数据结点中都有两个指针,分别指向直接后继和直接前驱,从双向链表中的任意一个结点开始,都可以很快速地访问它的前驱结点和后继结点,链表结构的使用多数都是构造双向循环链表。

2、基础操作

添加数据

95b5df923b203ece98112cb736c7c02b.png
  • 遍历找到链表的最后一个节点;
  • 修改当前末尾节点的next指针;
  • 新添加的节点房子在链表末尾;
  • 添加最新尾节点的prev指针;

删除数据

30f83d965d393fdc02edca70b83db9cb.png
  • 双向链表,基于要删除节点操作即可;
  • 操作上图中要删除的Node2节点;
  • Node2.prev.next = Node2.next;
  • Node2.next.prev = Node2.prev;

通过上述流程的操作,就把链表中一个节点删除,剩下节点再度连接成链式结构。

3、源码分析

在Java的API中,LinkedList是典型的双向链表结构,下面基于LinkedList源码看双向链表的操作。

基础案例

public 

节点描述

节点三个核心描述:数据,next指针,prev指针。

private 

首位节点处理

基于LinkedList源码,首尾节点方式,针对上图双链表的首位指针特点,这里源码很好理解。

public 

添加节点

添加节点的方法直接调用linkLast方法,把新节点放到链表的尾部即可。

public 

删除节点

第一步:遍历对比,找到要删除的节点;

public 

第二步:移除节点,重新搭建链表结构,并且把当前链表的数据置为null,并返回被移除的节点;

E 

如上就是对Java中LinkedList双链表源码的部分结构分析,这种代码看多了,总感觉自己写的代码不是Java。

四、环形链表

在单链表中,将终端结点的指针域NULL改为指向表头结点或开始结点,这样就形成了环形链表:

5702ac7ab615ecfed7d57f8965b0d260.png

环形链表链表的一种结构,特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值