数据结构-(链表)

3.1 链表引入
已经使用变量,数组,还有自定义容器类存放数据;

变量:存储一个值;
数组:存储多个值;
自定义容器类: 在类中封装一个数组;

对于变量直接赋值使用; 对于数组,通过下标使用; 对于自定义容器类的操作,我们通过添加add方法,进行使用.它的原理是内部使用数组来存储实现,但是用户并不关心内部怎么实现.

需求:--------------------------------->

如果在设计一个容器类(自定义一个容器类),对于容器类的操作,一般提供一个add方法,调用add方法的时候,需要传一个值,然后把值存放在容器里面,
但是现在【不用数组】, 那还可以用什么类型方式存储?

分析:-------------------------->
现在基于变量的方式来存储,比如一组零散的数据放到容器里面,对于容器类,能够准确的提供方法来添加,能够操作就可以了,我们也不关心怎么存放;
对于这些数据,可能是整型,字符串,假如现在把这些零散的数据都看成对象.

比如使用变量 :int i1 = 11;
int i2 = 4;
如果看成对象使用Integer的写法:
Integer i11 = 11;
Integer i12 = 4;

如果看成对象来看的话,在堆栈图中是怎样的?
栈里面i11,指向堆里面地址,所以操作这些地址就是相当于操作值了.
现在我把这些零散的对象连起来。

第一个对象地址,比如0x1234,容器类里面存放一个变量(Integer i11)

i11,拿到i11的地址,因为跟其他对象是关联的,那它是不是也就拿到的其他关联上对象的地址。

示意图:--------------------------->

问题: 怎样把 4 和11连接起来?
分析:比如现在把Integer i11 变量指向它的引用,相等于把i11存放在容器类里面了,现在
让11对象里面存放4的地址,但是都是Integer 对象,怎么存放别对象的地址?

思路: 根据刚才分析,在容器当中存放一个变量,也就是定义一个变量,指向该对象;
在对象当中,又有变量指向其他对象.这就就连接起来;

现在自定义一个类Node(相当于口袋),类里面定义两个字段,
① 一个Object类型存放值,
② 一个Node类型字段,存放下一个Node对象地址.
把11封装成一个Node对象,把对象放到容器里面,但是现在不放在容器里面,而在内部定义Node类型变量first,把first指向11地址;如果在添加一个。比如22,通过一个方法,把22封装成Node对象,然后让11和22联系起来,那怎么让11和22联系起来?
class Node{
Object data;//用于添加数据…
Node node;//用于保存下一个对象的地址
}
可以在11对象中定义一个变量,让这个变量指向22这个对象,那就应该在Node类里面定义一个变量,这个变量存放什么值,就是存放Node对象,所以应该定义成Node类型。
如下图:
在这里插入图片描述

这种一个对象连着一个对象的结构 — 链表;

3.2 基于类实现链表
怎么写代码实现上面的步骤?

定义容器类,定义一个口袋类(Node),在容器里面有个字段,在容器类里面还应该提供添加,查找,删除方法;比如类里面提供一个add方法;

完善链表结构add方法?

①把用户传入的数据打包成Node对象,但是需要把Node对象放到容器里面去,不能放到方法里面创建,所以放到自定义容器类里面创建,比如在容器里面创建一个Node对象first,让first变量指向创建的对象。

②把打包好的数据挂在first上面,注意在挂上去之前,先判断,如果是第一次,直接挂上去放到first上,如果第二次,第三次,挂在最后一个添加Node对象的上面;

怎么确定是第一次添加?First等于null的时候,是第一次;直接把Node的值赋值给first就添加好第一个元素;

如下图实现:
在这里插入图片描述
3.3 链表添加实现
怎么实现上面添加的结构?

每一次添加一个元素的时候,先封装成一个Node对象,添加之前进行判断,如果添加的是第一个元素(first == null),直接赋值,如果添加的是第二个元素,放到整个链表结构的最后,所以需要找到链表结构中最后一个对象。怎么找到最后一个对象?

如果Node对象的next字段为空,那么这个对象就是最后一个,怎样找到next对象为空。
在这里插入图片描述

分析:---------->

临时定义一个变量Node f;
第一次,f=first :f和first同时都指向第一个对象,操作f相当于操作第一个对象;
判断 (f.next == null)如果为 false --》转移目标,让f指向下一个对象,怎么让f指向下一个对象; f.next 就是指的第二个对象地址;
第二次,f = f.next :f指向第二个对象,再一次操作f,相当于操作第二个对象,
判断 f.next == null false —》转移目标。。。
直到f.next == null ,true f指向对象的next为空,f.next = node;

在这里插入图片描述
上面while循环完之后,temp始终指向的对象的next 为空.上面while循环完之后,temp始终指向的对象的next 为空.
3.4 链表覆写toString方法
现在对于自定义容器里面,添加了一个add方法,调用一次添加一次,现在我想验证是否已经添加进去容器里面,怎么验证?
覆写toString方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值