前面的文章中介绍了数组这种应用最广泛的数据结构,数组的使用很简单,但是数组存在着诸多不足,例如在无序数组中的查询时间复杂度为O(n),在有序数组数组中,插入的时间复杂度为O(n);本篇将介绍另一种应用广泛的数据结构-链表(LinkList),它在某些数据结构的实现中可以取代数组。
一、什么是链表
链表(LinkList
)是一种数据结构。在链表中,每个数据项被包含在链结点Link
中,每个Link
结点实际上就是一个结点对象,它包含了对前一个结点的引用(preLink
)和后一个结点(postLink
)的引用,通过这个引用关系,将一个个结点Link
串联成链表ListList
。
二、用Java构造一个链表
1、链表结点Link
的构造:
//链表结点
static class Link{
public int data;//结点中存储的数据
public Link next;//下一个结点
//含参构造方法
public Link(int data){
this.data = data;
}
//遍历链表
public void displayLink(){
System.out.print(this.data+"->");
}
}
2、链表LinkList
的构造:
public class LinkList {
//第一个链结点
private Link first;
//含参构造,将first赋为null
public LinkList(){
this.first = null;
}
//判断链表是否为空
public boolean isEmpty(){
return (this.first == null);
}
//插入链头结点
public void insertFirst(int data){
Link linkFirst = new Link(data);
linkFirst.next = this.first;//linkHead -> old first
this.first = linkFirst;//new first -> linkHead
}
}
3、deleteFirst方法
//删除链头
public void deleteFirst(){
this.first = this.first.next;
}
4、遍历链结点
//遍历链表
public void displayLinkList(){
Link current = this.first;//从链头开始遍历
while (current != null){
//当前链结点不为空即输出内容
current.displayLink();
//将当前链结点指向下一个链结点
current = current.next;
}
}
5、完整程序:
package com.example.demo;
/**
* @Description:LinkList Demo
* @CreateDate: Created in 2018/10/8 23:05
* @Author: <a href="https://blog.csdn.net/pbrlovejava">arong</a>
*/
public class LinkList {
//第一个链结点
private Link first;
//含参构造,将first赋为null
public LinkList(){
this.first = null;
}
//判断链表是否为空
public boolean isEmpty(){
return (this.first == null);
}
//插入链头结点
public void insertFirst(int data){
Link linkFirst = new Link(data);
linkFirst.next = this.first;//linkHead -> old first
this.first = linkFirst;//new first -> linkHead
}
//遍历链表
public void displayLinkList(){
Link current = this.first;//从链头开始遍历
while (current != null){
//当前链结点不为空即输出内容
current.displayLink();
//将当前链结点指向下一个链结点
current = current.next;
}
}
//删除链头
public void deleteFirst(){
this.first = this.first.next;
}
//链表结点
static class Link{
public int data;//结点中存储的数据
public Link next;//下一个结点
//含参构造方法
public Link(int data){
this.data = data;
}
//输出链结点
public void displayLink(){
System.out.print(this.data+"->");
}
}
}
6、测试链表:
@Test
public void fun1(){
LinkList linkList = new LinkList();
linkList.insertFirst(1);
linkList.insertFirst(2);
linkList.insertFirst(3);
linkList.insertFirst(4);
linkList.insertFirst(5);
System.out.println("遍历1");
linkList.displayLinkList();
System.out.println("删除两个链头");
linkList.deleteFirst();
linkList.deleteFirst();
System.out.println("遍历2");
linkList.displayLinkList();
}