1.理解Java是如何构造出链表的
我们知道JVM里有栈区和堆区,栈区主要存引用,也就是一个指向实际对象的地址,而堆区存的才是创建的对象
例如下面这个类:
public class Node {
int val;
Node next;
}
我们可以知道next就指向了下一个Node了
具体情况如下图:
这里通过栈中的引用就可以找到val(1),然后val(1)结点又存了指向val(2)的地址(也就是next),而val(3)又存了指向val(4)的地址,所以就构造出了一个链条访问结构。
在Java配套代码中BasicLink类,我们debug一下看一下从head开始next会发现是这样的:
这就是一个简单的线性访问了,所以链表就是从head开始,逐个开始向后访问,而每次所访问对象的类型都是一样的。
2.链表增加元素
在链表中添加元素的原理如下图:
也就是将需要添加元素的位置的前驱结点的next指针赋值给新添加结点的next,再将next指针指向newNode
newNode.next = Node1.next;
Node1.next = newNode;
上述代码不可交换位置!!
因为如果先执行Node1.next = newNode; 那么就失去了访问Node2的方式,Node2将变为不可达,导致添加操作失败并造成链表结构发生变化
在首部添加元素
在首部添加元素原理如下:
具体代码如下:
Node newNode = new Node(1);
newNode.next = head;
head = newNode;
在首部添加元素相对而言较为简单,只需将新结点指向原首结点,然后再将head指针赋值为新结点即可。
在中间添加元素
与先前的添加元素的原理一致,此处不再赘述。
在尾部添加元素
与在中间添加元素差不多,只不过需要注意的是此处新节点的next指针指向的是null
代码如下:
Node current = head;
while(current.next != null)
{
current = current.next //往后遍历,直到最后一个结点
}
Node newNode = new Node(1);
newNode.next = current.next;
current.next = newNode;
从代码上看,似乎只比原本多了一个向后遍历的代码
3.链表删除元素
我们还是先来看在链表中删除元素的原理图:
此时要删除的结点为Node2,我们将他的前驱节点Node1的current指针指向他的后继结点Node3,这样Node2就会被标记为不可达,在后续Java虚拟机(JVM)会通过垃圾回收器自动回收此无效节点,并释放它们占用的内存。
代码如下:
Node1.next = Node1.next.next;
在首部删除元素
在首部删除元素原理如下:
可以看出删除首部元素较为简单,只需将head = head.next 原本的首部元素便会变为不可达。
在中间删除元素
同上,与先前的删除元素的原理一致,此处不再赘述。
在尾部删除元素
在尾部删除元素原理如下:
Node current = head;
while(current.next.next != null)
{
current = current.next //往后遍历,直到最后一个结点
}
current.next = current.next.next
原理与删除中间元素也近乎一致,只不过指向了null,且多了一次遍历
总结
通过本次学习,掌握了链表的基本操作方法以及在java中链表的结构