链表(Linked list):是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针,使其他们连接起来。
优点 :链表在内存中是分散的,使用链表结构可以克服需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
缺点:链表失去了数组随机(随意)读取的优点,并且空间开销比较大(需要频繁的创建新的实例)
单向链表的实现与解析:
(1) 创建单向链表
单向链表是链表中结构最简单的。一个单链表的节点分为两个部分,第一个部分保存或者显示关于节点的信息,另一个部分存储下一个节点的地址。最后一个节点存储地址的部分指向空(null)
public class SingleLinkedList {
private int size; //节点个数
private Node head;//头节点
public SingleLinkedList(){
size = 0;
head = null;
}
class Node{
private Object data;// 每个节点的数据
private Node next;// 每个节点指向下一个节点的连接
public Node(Object data) {
this.data = data;
}
}
}
(2)添加节点
只需要将当前插入的节点设置为头节点,next指向原头节点即可
//添加 头节点
public void addHead(Object object) {
Node node = new Node(object);
if (size > 0) {
node.next = head;
}else{
node.next = null;
}
head = node;
size++;
}
(3)删除节点
删除一个节点,我们只需将该节点的上一个节点的next指向该节点的下一个节点。
//删除头节点
public Object delectHead() {
Object object = head.data;
head = head.next;
size--;
return object;
}
通过遍历找到需要删除的节点 ,判断是否是头节点若是直接将头节点指定为头节点的下一个
若不是该节点的上一个节点的next指向该节点的下一个节点。
//删除指定节点
public boolean delect(Object object) {
if (size == 0) {
return false;
}
Node lastNode = head;
Node node = head;
while (node.data != object) {
if (node.next == null) {
return false;
}else {
lastNode = node;
node = node.next;
}
}
//删除的是第一个节点
if (lastNode == node) {
head = head.next;
size--;
}else {
lastNode.next = node.next;
size--;
}
return true;
}
(4) 查找指定节点
通过头节点依次往下遍历,找到之后返回该节点
//查找指定节点
public Node find(Object object) {
Node node = head;
int item = size;
while (item > 0) {
if (object.equals(node.data)) {
return node;
}else {
node = node.next;
}
item--;
}
return null;
}
(5)判断链表是否为空
//判断链表是否为空
public boolean isEmpty() {
return(size == 0);
}
(6)打印链表节点信息
循环输出链表个个节点
public void printNode() {
if (size > 0) {
Node node = head;
if (size == 1) {
System.out.println("["+node.data+"]");
return;
}
int item = size;
System.err.print("[");
while (item > 0) {
if (node.next == null) {
System.err.print(node.data + "]");
}else {
System.err.print(node.data + ",");
}
node = node.next;
item--;
}
}else {
System.err.println("[]");
}
}