单链表
单链表通过next节点,把每一个元素串联起来,形成一个链状结构
基本用法:
1 写一个节点类,包含要存储的元素,还要一个next节点。
2 写一个链表类,类中最重要的就是一个头节点,其他元素不用保存,单链表就是通过头节点 , 管理每一个节点的。不过头节点一般不能动,都是使用临时变量进行操作
3 在链表类中实现各种操作的方法
package LinkedList;
public class SingleLinkListDemo {
public static void main(String[] args) {
VTuberNode vTuberNode = new VTuberNode(1, "东雪莲", "管人痴");
VTuberNode vTuberNode1 = new VTuberNode(2, "嘉然", "嘉心糖");
VTuberNode vTuberNode2 = new VTuberNode(3, "永雏塔菲", "热水器");
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addVTuber(vTuberNode);
singleLinkedList.addVTuber(vTuberNode1);
singleLinkedList.addVTuber(vTuberNode2);
singleLinkedList.addOrderBy(vTuberNode2);
singleLinkedList.showList();
System.out.println("\n\n");
singleLinkedList.update(new VTuberNode(2, "嘉然", "主人"));
singleLinkedList.showList();
System.out.println("\n\n");
singleLinkedList.delete(new VTuberNode(2, "嘉然", "主人"));
singleLinkedList.showList();
System.out.println("\n\n");
singleLinkedList.addOrderBy(vTuberNode1);
singleLinkedList.showList();
System.out.println("\n\n");
}
}
//链表类,用于管理每一个节点,单链表我们只要保存它的头节点就可以了(这个很重要),通过头节点进行管理。
class SingleLinkedList {
//初始化头节点,这个头节点是不能动的,//不存放具体数据
private VTuberNode head = new VTuberNode(0, " ", " ");
//添加方法
//找到最后一个,把它的next指向
public void addVTuber(VTuberNode vTuberNode) {
VTuberNode temp = head;//头节点不能动,所以需要一个临时变量,指向头节点
while (true) {
if (temp.next == null) {
break;//找到就返回
}
temp = temp.next;
}
//结束循环后,就指向了最后一个元素
temp.next = vTuberNode;//
}
//输出链表
public void showList() {
if (head.next == null) {
System.out.println("链表为空");
return;
}
//头节点不能动,需要一个辅助变量遍历
VTuberNode temp = head.next;
while (true) {
if (temp == null) {
break;//到链表尾了
}
System.out.println(temp);
temp = temp.next;
}
}
//顺序插入方法
public void addOrderBy(VTuberNode vTuberNode) {
VTuberNode temp = head; //临时
boolean flag = false; //记录是否已经存在这样一个节点了,默认是不存在
while (true) {
if (temp.next == null) //到链表的尾部了
break;
if (temp.next.no == vTuberNode.no)//找到了相同的节点
{
flag = true;
break;
}
if (temp.next.no > vTuberNode.no)//找的位置了
{
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("添加失败。这个节点已经存在了");
return;
}
VTuberNode temp2 = temp.next;
temp.next = vTuberNode;
vTuberNode.next = temp2;
System.out.println("添加成功");
}
//更新节点的方法,序列号不变,其他信息做修改
public void update(VTuberNode vTuberNode) {
boolean flag = false;//记录是否存在这个节点
VTuberNode temp = head;
while (true) {
if (temp.next == null) {
break;
}
//没有找到
if (temp.next.no == vTuberNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if (!flag) {
System.out.println("更新失败,不存在这样一个节点");
return;
}
VTuberNode temp2 = temp.next.next;
temp.next = vTuberNode;
vTuberNode.next = temp2;
System.out.println("修改成功");
}
//删除节点的方法
//由于是单链表,我们需要找到前一个一个元素
public void delete(VTuberNode vTuberNode) {
VTuberNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
//没有找到
if (temp.next.no == vTuberNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if (!flag) {
System.out.println("删除失败,不存在这样一个元素");
return;
}
temp.next = temp.next.next;//重新指向
System.out.println("删除成功");
}
}
class VTuberNode { //节点类
public int no;//顺序
public String name; //名字
public String nickname;//昵称
public VTuberNode next;//下一个节点
public VTuberNode(int no, String name, String nickname) { //构造方法
this.no = no;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
return "VTuberNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\''
+
'}';
}
}
双向链表
相对于单链表的区别就是它有头指针和尾指针,分别指向前一个元素和后一个元素。有了两个指针,方便了很多操作
package LinkedList; import java.util.LinkedList; public class DoubleLinkedListDemo { public static void main(String[] args) { VTuberNode2 vTuberNode = new VTuberNode2(1, "东雪莲", "管人痴"); VTuberNode2 vTuberNode1 = new VTuberNode2(2, "嘉然", "嘉心糖"); VTuberNode2 vTuberNode2 = new VTuberNode2(3, "永雏塔菲", "热水器"); DoubleLinkedList doubleLinkedList = new DoubleLinkedList(); doubleLinkedList.addVTuber(vTuberNode); doubleLinkedList.addVTuber(vTuberNode1); doubleLinkedList.addVTuber(vTuberNode2); doubleLinkedList.showList(); System.out.println("\n\n"); VTuberNode2 vTuberNode3 = new VTuberNode2(2, "嘉然", "主人"); doubleLinkedList.update(vTuberNode3); doubleLinkedList.showList(); System.out.println("\n\n"); doubleLinkedList.delete(vTuberNode3); doubleLinkedList.showList(); System.out.println("\n\n"); VTuberNode2 vTuberNode4 = new VTuberNode2(2, "嘉然", "嘉心糖"); doubleLinkedList.addVTuber(vTuberNode4); doubleLinkedList.showList(); System.out.println("\n\n"); } } class DoubleLinkedList { private VTuberNode2 head = new VTuberNode2(0, "", ""); //遍历方法 public void showList() { if (head.next == null) { System.out.println("链表为空"); return; } //头节点不能动,需要一个辅助变量遍历 VTuberNode2 temp = head.next; while (true) { if (temp == null) { break;//到链表尾了 } System.out.println(temp); temp = temp.next; } } //添加方法 public void addVTuber(VTuberNode2 vTuberNode) { VTuberNode2 temp = head;//头节点不能动,所以需要一个临时变量,指向头节点 while (true) { if (temp.next == null) { break;//找到就返回 } temp = temp.next; } //结束循环后,就指向了最后一个元素,形成一个双向链表 temp.next = vTuberNode;// vTuberNode.pre = temp;// } //修改方法 public void update(VTuberNode2 vTuberNode) { boolean flag = false;//记录是否存在这个节点 VTuberNode2 temp = head.next; if(temp==null) { System.out.println("更新失败,不存在这样一个节点"); return; } while (true) { //没有找到 if (temp.no == vTuberNode.no) { flag = true; break; } temp = temp.next; } if (!flag) { System.out.println("更新失败,不存在这样一个节点"); return; } temp.name = vTuberNode.name; temp.nickname = vTuberNode.nickname; System.out.println("修改成功"); } //删除节点方法 public void delete(VTuberNode2 vTuberNode) { VTuberNode2 temp = head.next; boolean flag = false; if (head.next == null) { System.out.println("删除失败,不存在这样一个元素"); return; } while (true) { if (temp == null) { break; } if (temp.no == vTuberNode.no) { flag = true; break; } temp = temp.next; } if (flag) { temp.pre.next = temp.next; if (temp.next != null) {//最后一个元素不为空 temp.next.pre = temp.pre; } System.out.println("删除成功"); } else { System.out.println("删除失败,元素不存在"); } } } class VTuberNode2 { //节点类 public int no;//顺序 public String name; //名字 public String nickname;//昵称 public VTuberNode2 next;//下一个节点 public VTuberNode2 pre;//前一个节点 public VTuberNode2(int no, String name, String nickname) { //构造方法 this.no = no; this.name = name; this.nickname = nickname; } @Override public String toString() { return "VTuberNode{" + "no=" + no + ", name='" + name + '\'' + ", nickname='" + nickname + '\'' + '}'; } }