3.双向链表
使用带head头的双向链表实现-水浒英雄排行榜管理的优缺点分析
1.单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找
2.单向项链表不能自我删除,需要靠辅助节点,啊,双向链表可以自我删除,所以前面我们单链表删除时,总是找到temp(待删除节点的前一个节点)
新增:
/**
* 1.添加到末尾
*
* @param node
*/
public void add(HeroNode2 node) {
//定义一个临时变量,因为head不能变化,所以定义一个中间变量
HeroNode2 tmp = head;
//找到队列的最后一个元素,最后一个元素的next=null
while (tmp.getNext() != null) {
tmp = tmp.getNext();
}
tmp.setNext(node);
//多这一行
node.setPre(tmp);
}
删除:
/**
* 根据编号删除
*
* @param no
*/
public void delete(int no) {
HeroNode2 temp = head.getNext();
//找到需要删除的节点
boolean flag = true;
while (true) {
if (temp == null) {
flag = false;
break;
}
//tmp就是需要删除节点
if (temp.getNo() == no) {
break;
}
temp = temp.getNext();
}
if (flag) {
temp.getPre().setNext(temp.getNext());
//重点1:这里需要考虑最后一个元素的删除,最后一个元素只需要执行上面的话即可,当执行下面temp.getNext()=null,null.setpre会报空指针
if (temp.getNext() != null) {
temp.getNext().setPre(temp.getPre());
}
} else {
System.out.println("删除失败,链表中没有该节点:" + no);
}
}
测试:
HeroNode{no=1, name='宋江', nickName='及时雨'}
HeroNode{no=2, name='卢俊义', nickName='玉麒麟'}
HeroNode{no=3, name='吴用', nickName='智多星'}
HeroNode{no=4, name='林冲', nickName='豹子头'}
删除2节点-----
HeroNode{no=1, name='宋江', nickName='及时雨'}
HeroNode{no=3, name='吴用', nickName='智多星'}
HeroNode{no=4, name='林冲', nickName='豹子头'}