双链表构造
每个节点可以存放到离散空间中,利用指针将每个节点串起来
节点由数据域与指针域组成,指针域存在两个指针,一个指向上一个节点,一个指向下一个节点
存在一个头结点,无数据域,只有一个指针指向首节点,方便后续操作
尾节点指向下一个节点的指针为null
与单链表的区别
双链表每个节点有两个指针,一个指针指向前一个节点,一个指针指向后一个节点;
而单链表每个节点只有一个指针,指向下一个节点
Java中伪指针的表示——浅拷贝
类名 变量 = 对象名
这种不用new的实例化,让变量可以作为指针使用(内存地址相同),当变量(该变量可以看作一个对象)属性改变时,它指向的那个对象属性跟着改变
节点如何表示
//编写节点
class HeroNode_2 {
public int id;//英雄编号
public String name;//英雄姓名
public HeroNode_2 last;//指向上一个节点(是个对象)
public HeroNode_2 next;//指向下一个节点(是个对象)
//构造器
public HeroNode_2(int hid, String hname) {
this.id = hid;
this.name = hname;
this.last = null;//这句可以不用写,没有赋值时last本身就是null
this.next = null;//这句可以不用写,没有赋值时next本身就是null
}
//显示方法
@Override
public String toString() {
return "HeroNode_2 英雄编号: " + id + " 英雄姓名: " + name;
}
}
链表的整体架构
//创建双链表,管理英雄
class Hero2Link {
//先初始化一个头结点,头结点不能动,且不存放具体数据,因为只能存在一个,故设置其为私有对象
private HeroNode_2 head = new HeroNode_2(0, "");
/*
添加节点到双向链表中,添加至末尾;
具体方法:先new一个新节点,上一个节点指针(next变量)指向该节点,新节点的last变量指向上一个节点
步骤 1.先遍历找到链表的最后节点
2.new一个新节点(这里因为将新节点作为参数,故无需new)
3.将上一个节点的next变量指向新节点
4.将新节点的last变量指向上一个节点
*/
public void append(HeroNode_2 heroNode) {
//因为头结点不能动,所以需要一个辅助遍历变量temp
HeroNode_2 temp = head;
//遍历链表,找到最后一个节点,该节点next变量为null
//简洁版
// while (temp.next != null) {
// //让temp指向下一个节点,检测下一个个节点next是不是null
// temp = temp.next;
// }
//上一个循环为简洁遍历,看不懂可以参考下面的遍历方法
while (true) {
//找到那个节点next变量为null则跳出循环,找不到则继续遍历,将temp指向下一个节点
if (temp.next == null) {
break;
} else {
temp = temp.next;
}
}
//当退出循环时,temp就指向了最后一个节点
//将该节点的next指向要添加的那个节点
temp.next = heroNode;
heroNode.last = temp;
}
//显示链表[遍历]
public void list() {
//先判断链表是否为空,为空直接不用遍历
if (head.next == null) {
System.out.println("链表为空");
return;
}
//头结点不能动,需要一个辅助变量遍历
HeroNode_2 temp = head;
//简洁版
while (temp.next != null) {
//让temp指向下一个节点,检测下一个个节点next是不是null
//这里主要要先改遍历节点在输出,否则会出现输出头结点,不输出尾节点的现象
temp = temp.next;
System.out.println(temp);
}
}
}
下一篇: Java版双链表如何实现增插删改查