一、数据结构第一章(双向链表)
双向链表的遍历、添加、修改、删除的思路
- 1)遍历
方式和单链表一样,可以向前,也可以向后查找
代码如下(示例):
public void list(){
// 判断链表是否为空
if(head.next==null){
System.out.println("链表为空");
return;
}
// 因为头节点不能动,需要辅助变量遍历
HeroNode2 temp = head.next;
while (true){
// 判断是否到最后
if(temp==null){
break;
}
// 输出节点信息
System.out.println(temp);
// 将temp后移
temp = temp.next;
}
}
- 2)添加(默认添加到双向链表的最后)
-(1)先找到双向链表的最后这个节点
-(2)temp.next=newHeroNode
-(3)newHeroNode.pre=temp
代码如下(示例):
public void add(HeroNode2 heroNode){
// 思路,当不考虑编号的顺序时,找到当前链表的最后节点,将最后这个节点的next指向新的节点
// 因为头节点不能动,因此我们需要一个辅助遍历temp
HeroNode2 temp =head;
// 遍历链表找到最后节点
while (true){
// 找到链表的最后
if(temp.next==null){
break;
}
// 如果没有找到,将temp后移
temp =temp.next;
}
// 退出循环,temp指向链表最后
temp.next=heroNode;
heroNode.pre=temp;
}
- 3)修改思路和原理和单向链表一样
-
代码如下(示例):
public void update(HeroNode2 newHeroNode){
if(head.next==null){
System.out.println("链表为空");
return;
}
HeroNode2 temp =head.next;
boolean flag =false;
while (true){
if(temp==null){
break;//链表遍历结束
}
if (temp.no==newHeroNode.no){
flag=true;
break;
}
temp =temp.next;
}
if(flag){
temp.name = newHeroNode.name;
temp.nickName= newHeroNode.nickName;
}else{
System.out.println("没有找到编号为"+newHeroNode.no);
}
}
- 4)删除
-(1)可以实现自我删除某个节点
-(2)直接找到要删除的节点
-(3)temp.pre.next=temp.next
-(4)temp.next.pre=temp.pre
代码如下(示例):
public void del(int no){
if(head.next==null){
System.out.println("链表为空,无法删除");
return;
}
HeroNode2 temp = head.next;
boolean flag =false;
while (true){
if(temp==null){//已经找到最后节点
break;
}
if(temp.next.no==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("需要删除的不存在"+no);
}
}
}