单链表
实现原理:
利用类来充当一个结点的类型,结点的值为类的一个属性,通过另一个属性来指向关联下一个结点,这个属性也是当前类的类型。
单链表的创建
package com.xingyun.linked;
/*
* 单链表的实现,是一种链式结构。每一个结点都必须含有下一个结点的指向地址,
* */
public class Node {
//定义属性,结点的携带值
int data;
//指向的下一个结点的地址
Node next;
//构造方法,构造出一个新的结点,需要携带一个数值的参数,表示当前结点的携带数据
public Node(int data) {
this.data=data;
}
//为当前结点追加新结点
public Node append(Node node) {
//获取当前结点
Node currentNode=this;
//循环向后找,直到当前链表的最后一个结点为止
while(true) {
//取出下一个结点
Node nextNode = currentNode.next;
//如果currentNode的下一个结点为null,说明当前结点currentNode已经是最后一个结点了
if(nextNode==null) {
break;
}else {
//否则,当前currentNode结点后面还有结点,所以需要向后递进,继续寻找
currentNode=nextNode;
}
}
//将要追加的结点追加为找到的结点(当前链表的最后一个结点)的下一个结点
//需要注意的是这里的赋值,是将参数对象赋给当前最后一个结点对象的next属性。
currentNode.next=node;
//这里可以有返回值,也可以没有返回值,有返回值时:方便对一个结点进行多次追加,
//如果没有,那么需要每一次都是对象.方法(参数)来追加。在调用的时候会显示写出
//有没有返回值的两种不同的调用方法。
return this;
}
//获取下一个结点
public Node next() {
return this.next;
}
//拿到当前结点的数据
public int getData() {
return this.data;
}
//判断当前结点是否为链表的最后一个结点
public boolean isLast() {
return this.next==null;
}
public static void main(String[] args) {
//创建链表的头结点
Node node=new Node(5);
//创建其余结点
Node node1=new Node(8);
Node node2=new Node(9);
Node node3=new Node(45);
Node node4=new Node(75);
//给头结点追加新结点
/*
如果没返回值的时候
node.append(node1);
node.append(node2);
node.append(node3);
node.append(node4);
*/
//如果有返回值的时候
node.append(node1).append(node2).append(node3).append(node4);
//判断当前结点是否为最后此链表的最后一个结点
//node.next(),获取的是node的下一个结点
System.out.println(node.next().next().isLast());
//取出下一个结点的数据
//node.next()也就是node1这个对象,node1这个对象的值为8
System.out.println(node.next().getData());
}
}
单链表的基本操作
增、删、查(查询全部)
package com.xingyun.linked;
/*
* 单链表的实现,是一种链式结构。每一个结点都必须含有下一个结点的指向地址,
* */
public class Node {
//定义属性,结点的携带值
int data;
//指向的下一个结点的地址
Node next;
//构造方法,构造出一个新的结点,需要携带一个数值的参数,表示当前结点的携带数据
public Node(int data) {
this.data=data;
}
//为当前结点追加新结点
public Node append(Node node) {
//获取当前结点
Node currentNode=this;
//循环向后找,直到当前链表的最后一个结点为止
while(true) {
//取出下一个结点
Node nextNode = currentNode.next;
//如果currentNode的下一个结点为null,说明当前结点currentNode已经是最后一个结点了
if(nextNode==null) {
break;
}else {
//否则,当前currentNode结点后面还有结点,所以需要向后递进,继续寻找
currentNode=nextNode;
}
}
//将要追加的结点追加为找到的结点(当前链表的最后一个结点)的下一个结点
//需要注意的是这里的赋值,是将参数对象赋给当前最后一个结点对象的next属性。
currentNode.next=node;
//这里可以有返回值,也可以没有返回值,有返回值时:方便对一个结点进行多次追加,
//如果没有,那么需要每一次都是对象.方法(参数)来追加。在调用的时候会显示写出
//有没有返回值的两种不同的调用方法。
return this;
}
//获取下一个结点
public Node next() {
return this.next;
}
//拿到当前结点的数据
public int getData() {
return this.data;
}
//判断当前结点是否为链表的最后一个结点
public boolean isLast() {
return this.next==null;
}
//显示所有结点
public void getAll() {
//获取当前结点(一般为链表的头结点)
Node current=this;
while(true) {
//打印当前结点的值
System.out.print(current.data+"\t");
//当前结点已经打印完毕,此处需要向后继续递进,在当前类中的方法直接采用属性来递进,当然也可以调用方法
current=current.next;
//如果递进到最后一个结点,也就是结点对象为空时,退出即可
if(current==null) {
break;
}
}
System.out.println();
}
//删除一个结点
//因为这是单链表的删除,所以删除是通过断开前一个结点与下一个结点的联系来实现删除
//也就是直接拿当前结点的下下一个结点来作为当前结点的下一个结点,直接将当前结点的下一个结点剔除
public void remove() {
//断开当前结点与下一个结点直接的联系
this.next=this.next.next;
}
//插入一个结点
//因为是单链表,所以只能插入到当前结点后面
//具体原理:先找一个临时存储区(一个新的结点对象)来记录当前结点的下一个结点
//其次,将要插入的结点直接赋值作为当前结点的下一个结点。
//最后,当前结点的下一个结点是要插入的新结点,直接将临时存储区中的结点作为
//当前结点的下下一个结点。
public void after(Node n1) {
//创建临时存储区来记录当前结点的下一个结点
Node node=this.next;
//将要插入的结点直接作为当前结点的下一个结点
this.next=n1;
//当前结点的下下一个结点再去链接临时存储区中的结点
this.next.next=node;
}
public static void main(String[] args) {
//创建链表的头结点
Node node=new Node(5);
//创建其余结点
Node node1=new Node(8);
Node node2=new Node(9);
Node node3=new Node(45);
Node node4=new Node(75);
//给头结点追加新结点
/*
如果没返回值的时候
node.append(node1);
node.append(node2);
node.append(node3);
node.append(node4);
*/
//如果有返回值的时候
node.append(node1).append(node2).append(node3).append(node4);
//判断当前结点是否为最后此链表的最后一个结点
//node.next(),获取的是node的下一个结点
System.out.println(node.next().next().isLast());
//取出下一个结点的数据
//node.next()也就是node1这个对象,node1这个对象的值为8
System.out.println(node.next().getData());
//打印当前链表中的所有结点信息
node.getAll();
//插入一个新结点到当前链表中的某一个结点后面,哪个对象调用插入方法就将新结点插入到哪个对象所代表结点的后面
Node n1=new Node(66);
node3.after(n1);
node.getAll();
//删除node的下一个结点,也就是node1
node.remove();
//再次查看当前链表中的数据,看是否删除成功
node.getAll();
}
}