1.注意判断temp==null 的位置,应考虑放在最前面,防止出现空指针异常;
2.双向链表的自我删除(实则为两个指针更改,原数据域保留,两个指针保留),注意待删除的结点是否为最后一个结点;
3.添加结点时,注意判断添加的结点是否为最后一个结点;
//创建双向链表的类
class DoubleLink{
//头结点
private HeroNode2 head = new HeroNode2(0, "", "");
public HeroNode2 getHead() {
return head;
}
//遍历双向链表
public void showList(){
HeroNode2 temp=head.next;
if (temp==null)
System.out.println("链表为空");
while (true){
if (temp==null)
break;
else{
System.out.println(temp.toString());
temp=temp.next;
}
}
}
//添加结点
public void add(HeroNode2 heroNode2){
HeroNode2 temp=head;
boolean flag=false;
while (true){
if (temp.next==null)//*注意要把判断为空写在前面
break;
if (temp.next.no>heroNode2.no)//找到添加的位置
break;
if (temp.next.no==heroNode2.no){//添加信息重合,添加失败
flag=true;
System.out.println("信息重合,添加失败");
break;
}
temp=temp.next;
}
if (!flag){
if (temp.next!=null){//若待添加结点后面为空
temp.next.pre=heroNode2;
heroNode2.next = temp.next;
}
heroNode2.pre=temp;
temp.next=heroNode2;
}
}
//修改结点信息
public void update(HeroNode2 heroNode2){
HeroNode2 temp=head;
boolean flag=false;
while (true){
if (temp==null)//未找到,*注意要把判断为空写在前面
break;
if (temp.no==heroNode2.no) {//找到需要修改的结点
flag=true;
break;
}
temp=temp.next;
}
if (flag){
temp.name = heroNode2.name;
temp.nickname= heroNode2.nickname;
}
else
System.out.printf("未找到编号为%d的节点,修改失败",heroNode2.no);
}
//删除一个结点
public void delete(int no){
HeroNode2 temp=head.next;
boolean flag=false;
while (true){
if (temp==null)//未找到,*注意要把判断为空写在前面
break;
if (temp.no==no){//找到需要删除的结点
flag=true;
break;
}
temp=temp.next;
}
if (flag){
if (temp.next!=null)//待删除的结点不是最后一个
temp.next.pre=temp.pre;
temp.pre.next=temp.next;}
else
System.out.println("未找到需要删除的结点");
}
}
class HeroNode2{
public int no;
public String name;
public String nickname;
public HeroNode2 next;//指向下一个结点
public HeroNode2 pre;//指向前一个结点
public HeroNode2(int no,String name,String nickname){
this.name=name;
this.no=no;
this.nickname=nickname;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}