今天本狗想记录一下关于学习链表过程中的一些心得。
链表,这是一个让本狗当时比较费脑筋的东西。
老规矩,我就不扯从书上看到的知识点了,直接用简单的,本狗的理解出发,链表,本狗认为,就是不连续的数组,他们怎样联系呢?将每一个块分为数据域和指针域两个部分,数据域存放数据,指针域存放下一个块的位置,这样,就可以知道具体的位置了。
有关链表的优缺点,大概就是需要和线性表就行比较了。
插入、删除方便,查找不方便。
对于链表,还是直接拿代码上手分析比较带劲。
我们首先定义链表必须的数据域和指针域,同时再构造方法中进行初始化,然后定义一个显示的方法
public class Node { //数据域 public long data; //指针域 public Node next; public Node(long value){ this.data = value; } //显示方法 public void display(){ System.out.println(data + " "); } }
接下来定义方法
// 链表,相当于火车
public class LinkList {
//头结点
private Node first;
public LinkList() {
first = null;
}
// 插入一个结点,在头结点后进行插入
public void insertFirst(long value) {
Node node = new Node(value);
node.next = first;
first = node;
}
// 删除一个结点,在头结点后进行删除
public Node deleteFirst() {
Node tmp = first;
first = tmp.next;
return tmp;
}
//显示方法
public void display() {
Node current = first;
while(current != null) {
current.display();
current = current.next;
}
System.out.println();
}
// 查找方法
public Node find(long value) {
Node current = first;
while(current.data != value) {
if(current.next == null) {
return null;
}
current = current.next;
}
return current;
}
// 删除方法,根据数据域来进行删除
public Node delete(long value) {
Node current = first;
Node previous = first;
while(current.data != value) {
if(current.next == null) {
return null;
}
previous = current;
current = current.next;
}
if(current == first) {
first = first.next;
} else {
previous.next = current.next;
}
return current;
}
}
第一个方法是插入
对插入怎样理解呢,如上图, 1、2步一样,首先,我们用
node.next = first;让头结点指向待插入结点的后继,也就是下一个结点的位置,
first = node;接下来第二步,待插入结点指向头结点。这样就完成一个插入过程。
删除过程呢,比较简单
正常的是1、2顺序,若要删除待删除结点,只需要执行第三步就自动将其删除,虚拟机的垃圾回收机制会自动将其回收。
Node tmp = first;//将头结点给指向要删除的结点 first = tmp.next;//然后要删除结点的next指向first,此时虚拟机就会回收待删除结点。
显示方法呢?
调用递归方式来完成。
查找方法?
让头结点指向current指针,判断此指针是否等于传入的数值,不等于,判断此指针的指针域是否为空,空则直接返回,不为空,则让此指针的next指向current指针。
删除方法相同。
进行测试
package dataStructs; public class TestLinkList { public static void main(String[] args) { LinkList linkList = new LinkList(); linkList.insertFirst(34); linkList.insertFirst(23); linkList.insertFirst(12); linkList.insertFirst(0); linkList.insertFirst(-1); // linkList.display(); // // linkList.deleteFirst(); // linkList.display(); // // Node node = linkList.find(23); // node.display(); Node node1 = linkList.delete(0); node1.display(); System.out.println(); linkList.display(); } }
结果和测试数据因输入而异。