本文介绍:
本文内容主要是介绍了单链表的原理和单链表的实现代码。
单链表介绍:
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
下图就是一个结点的图片介绍:
单链表的原理图:
由单链表的介绍可知,单链表的组成是由若干个结点所连接成的,结点分为两个部分,一部分保存数据,另一部分保存下一个元素的地址,这也是链表的特性。
单链表追加结点需要从首结点往下找,直到找到最后一个结点,并将要追加的结点赋给最后一个结点的下一个结点,这样就追加成功了。
单链表删除指定的结点只需要找到要删除结点的上一个结点,并将上一个结点的下一个保存的地址(next)修改为下一个结点的下一个结点,就达到了删除指定结点的效果
单链表的插入结点需要将当前结点的下一个结点修改为要插入的结点,并将要插入结点的下一个结点修改为原来结点的下一个结点,这样就达到了单链表插入结点的效果。
单链表的代码实现:
//单链表
public class Node {
//结点内容 -- 数据
int data;
//下一个结点的地址
Node next;
//初始化单链表
public Node(int data) {
this.data = data;
}
//为结点追加结点
public Node append(Node node) {
//获取首结点
Node currNode = this;
//循环遍历找到当前链表的最后一个结点
while(true) {
//如果当前结点的next为空 -- 则当前结点为最后一个结点
if(currNode.next == null) {
//将要追加的结点node赋给当前结点的下一个结点next
currNode.next = node;
//返回首结点
return this;
}
//继续遍历
currNode = currNode.next;
}
}
//获取下一个结点next
public Node next() {
//需要判断是否next为空
if(isLast()) {
throw new RuntimeException("next is Empty");
}
//返回下一个结点
return this.next;
}
//删除下一个结点
public void removeNext() {
//取出下下一个结点
Node newNext = next.next;
//把下下一个结点设置为当前结点的下一个结点
this.next = newNext;
}
//插入一个结点作为当前结点的下一个结点
public void after(Node node) {
//获取当前结点的下个结点
Node newNode = this.next;
//将当前结点的下一个结点修改为要插入的结点node
this.next = node;
//最后将插入的结点node的下一个结点变为newNode,既没修改之前的当前结点的下一个结点
node.next = newNode;
}
//显示所有结点的信息
public void show() {
Node currNode = this;
while(currNode != null) {
System.out.print(currNode.data + " ");
currNode = currNode.next;
}
System.out.println();
return ;
}
//获取结点中的数据
public int getData() {
return this.data;
}
//当前结点是否是最后一个结点
public boolean isLast() {
return this.next == null;
}
public static void main(String[] args) {
//创建节点
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
n1.append(n2);
n1.append(n3).append(new Node(4));
System.out.print("单链表创建和追加后:");
n1.show();
System.out.print("获取n2的下一个结点的data:");
System.out.println(n2.next().getData());
System.out.print("判断n3是否为最后的结点");
System.out.println(n3.isLast());
System.out.print("删除n1的下一个结点后:");
n1.removeNext();
n1.show();
System.out.print("在n3的后面插入一个结点data为5:");
n3.after(new Node(5));
n1.show();
}
}
运行结果:
单链表创建和追加后:1 2 3 4
获取n2的下一个结点的data:3
判断n3是否为最后的结点false
删除n1的下一个结点后:1 3 4
在n3的后面插入一个结点data为5:1 3 5 4
生命不息,编程不止!加油!