链表
链表是一个常见的基础数据结构,可以理解为一种线性表,是一种物理存储单元上非连续、非顺序的存储结构。也可以称之为链式存储的线性表,链表是由多个链表元素(节点)组成,二节点之间通过逻辑连接,这样就形成了链式存储结构。
链表可以分为两个域:
1、数据域(值域):用来存储节点的值
2、指针域(链域):用来存储其后节点的地址或位置
下面我将对自己学过的链表做一个复习与总结,只是单纯的为了以后能够随时复习,它的存在相当于一个笔记的形式。
单链表
1、单链表的的每个节点只有一个next指针域,它是一种顺序存储结构。
2、单链表中每个节点的存储地址存放在其前驱节点(也就是上一个节点)的指针域中,那么问题来了,第一个节点前面没有节点了,所以应该设一个头指针H指向第一个节点。
3、同理,最后一个节点没有直接后继节点了,所以指定单链表的最后一个节点的指针域为空(NULL)。
4、单链表的头指针H标志着整个单链表的开始,所以必须得先知道头指针,才能够顺着每个节点的next指针域去得到单链表中的每个元素。
5、在单链表中要找到第N个节点或者数据元素,必须先找到第N-1个节点,通过它的指针域去拿到N的信息。
6、单链表只可向一个方向遍历。
7、有时候为了操作的统一方便,可以给单链表增加一个头结点,这个头结点数据域存储一些关于线性表的长度等附加信息,指针域用来存储指向第一个结点的指针,也就变成了H —> 头结点数据域/指针域 —> 第一个结点数据域/指针域…
单链表的基本操作
可以在单链表上执行各种操作,下面将介绍这些基本操作和实现。
package demo2;
//一个节点
public class Node {
//节点内容
int data;
//下一个节点
Node next;
public Node(int data) {
// TODO Auto-generated constructor stub
this.data=data;
}
//为节点追加节点
public Node append(Node node) {
//this.next=node;
//当前节点
Node currentNode=this;
//循环向后找
while(true) {
//取出下一个节点
Node nextNode=currentNode.next;
//如果下一个节点为null
if(nextNode==null) {
break;
}
//赋给当前节点
currentNode=nextNode;
}
//把需要追加的节点添加到找到的当前节点
currentNode.next=node;
return this;
}
//插入一个节点作为当前节点的下一个结点
public void after(Node node) {
//取出下一个节点
Node nextNext=next;
//把当前结点作为当前节点的下一个节点
this.next=node;
//把下下一个节点设置为新节点的下一个节点
node.next=nextNext;
}
//显示所有节点的信息
public void show() {
Node currentNode=this;
while(true) {
System.out.println(currentNode.data+" ");
currentNode=currentNode.next;
//如果是最后一个节点
if