我们单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
我们应该也使用过LinkedList的集合,它就是一个链表的结构,接下来我们来手动实现一下单链表,这样更加有利于了解其构成,首先创建一个Node单链表的节点
public class Node {
//数据域
public long data;
//指针域
public Node next;
public Node() {
}
public Node(long data) {
this.data = data;
}
public void display(){
System.out.print(this.data + " ");
}
}
接下来我们创建一个单链表LinkList
public class LinkList {
private Node first;
/**
* 插入一个节点,在头节点结束后进行插入
* @param value
*/
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();
}
/**
* 查找
* @param value
* @return
*/
public Node find(long value){
Node current = first;
while (current.data != value){
if (current.next == null) return null;
current = current.next;
}
return current;
}
/**
* 删除方法,根据数据删除
* 找到它前面的节点
* @param value
* @return
*/
public Node delete(long value){
Node current = first;
Node prev = first;
while (current.data != value){
if (current.next == null) return null;
prev = current;
current = current.next;
}
if (current == first){
first = first.next;
}else{
prev.next = current.next;
}
return current;
}
}
接下来编写测试类进行测试
public class TestLinkList {
public static void main(String[] args) {
LinkList linkList = new LinkList();
//插入
linkList.insertFirst(34);
linkList.insertFirst(23);
linkList.insertFirst(12);
linkList.insertFirst(2);
linkList.insertFirst(3);
//遍历
linkList.display();
//删除头部
linkList.deleteFirst();
linkList.display();
//查找
Node node = linkList.find(23);
node.display();
System.out.println();
//删除指定值
Node delNode = linkList.delete(23);
linkList.display();
}
}
运行结果如下: