双向链表
双向链表的定义
双向链表也可以进行首尾连接,构成双向循环链表,如下图所示
双向链表的优势
1)双向链表可以向前向后查找。
2)单向链表不能自我删除,需要借助辅助结点,而双向链表可以自我删除。
双向链表的基础操作
双向链表的插入
双向链表尾部插入
public void add(HeroNode2 heroNode){
//因为head是头指针,因此我们要创建一个临时变量
HeroNode2 temp = head;
//遍历链表,找到最后
while (true){
if(temp.next == null){
break;
}
//如果没有找到最后,继续往后找
temp = temp.next;
}
//退出循环说明找到最后一个,将最后一个指向新的节点
temp.next = heroNode;
heroNode.pre = temp;
}
双向链表按编号大小进行顺序插入
思路
1)首先循环遍历找到要插入的位置
2)判断要插入的是否为最后一个结点
3)(不是)根据下图的顺序进行结点与结点之间的连接
s.pre = p //s的前驱为p
s.next = p.next //s的后继为p的后继
p.next.pre = s //p的后继的前驱为s
p.next = s; //p的后继为s
代码实现
public void addById(HeroNode2 heroNode2){
HeroNode2 temp = head;
boolean flag = false;
while (true){
if(temp.next == null){
break;
}
if(temp.next.num > heroNode2.num){
break;
}else if (temp.next.num == heroNode2.num){
flag = true;
break;
}
temp = temp.next;
}
if (flag){
System.out.println("编号已经存在");
}else if(temp.next != null){ //不是最后一个结点
heroNode2.pre = temp;
heroNode2.next= temp.next;
temp.next.pre = heroNode2;
temp.next = heroNode2;
}else { //是最后一个结点
temp.next = heroNode2;
heroNode2.next = null;
heroNode2.pre = temp;
}
}
双向链表的删除
思路
1)循环遍历找到要删除的这个结点
2)注意要删除的结点是否为最后一个
代码实现
public void delete(int no){
if(head.next == null){
return;
}
HeroNode2 temp = head.next;
boolean flag = false;
while (true){
if(temp == null){
break;
}
if (temp.num == no){
flag = true;
break;
}
temp = temp.next;
}
if (flag){
temp.pre.next = temp.next;
if (temp.next != null) {
temp.next.pre = temp.pre;
}
}else {
System.out.println("没有该节点");
}
}
双向链表的修改
思路
与单链表一致,详情查看单链表章节
代码实现
public void update(HeroNode2 heroNode){
if(head.next == null){
return;
}
HeroNode2 temp = head.next;
boolean flag = false;
while (true){
if(temp == null){
break;
}
if (temp.num == heroNode.num){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.name = heroNode.name;
temp.nickname = heroNode.nickname;
}else {
System.out.println("没有找到");
}
}
双向链表的遍历
思路
与单链表一致,详情查看单链表章节
代码实现
public void list(){
if(head.next == null){
System.out.println("链表为空");
return;
}
//因为head是头指针,因此我们要创建一个临时变量
HeroNode2 temp = head.next;
while (true){
if(temp == null){
break;
}
System.out.println(temp);
temp = temp.next;
}
}
声明
本文是作者在学习数据结构中的一些笔记,希望能够帮助到大家。作者才疏学浅,如有错误,欢迎批评指正。