“招之即来,挥之即去”——链表

单向链表

链表:相对于数组,也就长度不固定,添加元素不用重建链表,插入、删除方便

一、总体思路

链表(对象)
有属性:头节点、尾节点、临时节点、链表长度
有方法:增、删、查、改、输出、获取大小等

链表节点
节点也是对象,由类创建

class Node {
	Object data;//Object一种数据类型(父类)
	Node next;
}

Node link; 这个刚接触时不好理解, link为一个节点对象,用于存放下一个对象的引用,起连接作用。类似与C语言中的指针

(对比)C语言 结构体


typedef struct student{
int score;
struct student *next;
} LinkList;


二、代码

1、add()


public void add(String s) {
		length++;
		if (root == null) { // 对第一个节点处理
			root = new Node();
			root.data = s;
			last = root;
		} else {
			temp = new Node();
			temp.data = s;
			last.link= temp; // 新建节点的“引用”放入上一节点的link中
			last = temp; // last指向最后一个
		}
	}

2、remove()

1、判断索引是否合理
2、删除第一个和最后一个
3、删除中间的
4、改变长度length
在这里插入图片描述
小小思考:删掉的第2个节点是否需要赋null呢?(答案见文末)

temp = root;// temp指向第一个
for (int i = 1; i < index - 1; i++) {// 指针往后移动到索引位置的前一位
	temp = temp.link;
}
if (temp.link.link== null) {// 如果索引位置的后一位为空,则直接赋null
	temp.next = null;
} else {
	temp.next = temp.link.link;
}

3、printList()

temp = root;
int flag = 1;
while (temp != null) {
	if (flag == 1) {
		System.out.print(temp.data);
		flag = 0;
	} else
		System.out.print("->" + temp.data);
	temp = temp.link;
}

在这里插入图片描述

4、查找及长度

查找:根据删除的遍历方法,以及判断data.equals(temp.data)查找元素返回索引
长度:return length 即可

三、测试比较

1、添加100000,删除100000
测试结果显示删除节点速度明显快20~30倍
为什么?
可能原因包括(1)循环的代码的量不一样 (2)创建对象所花的时间比一般的指令长

在这里插入图片描述
2、把数据量增加10倍
测试结果显示 数据量与处理时间并不是不是线性增长
为什么?
需要了解java语句、指令执行与时间的关系
在这里插入图片描述
3、当数据量设置为10000000,运行一段时间后抛出异常
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at java.lang.AbstractStringBuilder.(AbstractStringBuilder.java:64)
at java.lang.StringBuilder.(StringBuilder.java:109)
at List.MyArrayList.main(MyArrayList.java:75)

Java heap space java堆空间
OutOfMemoryError 内存溢出
通过这个我们应该有办法知道 java heap space 对内存有多大

四、小结一下

由于链表的灵活性,链表适用于
1)数据个数未知且变化的数据集的存储
2)大数的计算与处理
3)…
由于链表根据索引查找数据需要遍历,所以在牵涉到数据的排序时不便于使用

tips
#在写出add()方法之后,立马把printList()写出来,这样能够直观地检查每一步是否正确

answer for that question:
java对象的引用(对象名)存储在栈中,当对象没有引用指向时,java的垃圾回收器会在不确定的时间自动回收

以上仅为个人理解,如有理解不到位的地方请多多指教,一起交流探讨

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值