单向链表
链表:相对于数组,也就长度不固定,添加元素不用重建链表,插入、删除方便
一、总体思路
链表(对象)
有属性:头节点、尾节点、临时节点、链表长度
有方法:增、删、查、改、输出、获取大小等
链表节点
节点也是对象,由类创建
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的垃圾回收器会在不确定的时间自动回收
以上仅为个人理解,如有理解不到位的地方请多多指教,一起交流探讨