双向链表的图解释
分析:
双向链表的遍历
和遍历单链表一样,知识可以向前遍历,也可以向后遍历查找
双向链表的添加
我们这里是添加到链表的最后
1.先找到双向链表的最后节点
2.temp.next = newHeroNode
3.newHeroNode.pre = temp
双向链表的删除
因为是双向链表,因此我们可以实现自我删除某个节点。
1.直接找到要删除的这个节点,比如:temp
2.temp.pre.next = temp.next
3.Temp.next.pre = temp.pre
双向链表的增删改查
完整代码
package com.chad.lambda;
public class DoubleLinkedListDemo {
public static void main(String[] args) {
HeroNode2 hero1 = new HeroNode2(1,"宋江","及时雨");
HeroNode2 hero2 = new HeroNode2(2,"卢俊义","玉麒麟");
HeroNode2 hero3 = new HeroNode2(3,"吴用","智多星");
HeroNode2 hero4 = new HeroNode2(4,"林冲","豹子头");
DoubleLinkedList dll = new DoubleLinkedList();
//添加测试
dll.addHero(hero1);
dll.addHero(hero2);
dll.addHero(hero3);
dll.addHero(hero4);
dll.list();
//修改测试
System.out.println("测试修改");
HeroNode2 hero5 = new HeroNode2(4,"林冲","豹子头,八十万禁军教头");
dll.updateHero(hero5);
dll.list();
//测试删除
System.out.println("测试删除");
dll.deleteHero(4);
dll.list();
}
}
class DoubleLinkedList{
//初始化一个头节点,不存放具体数据
private HeroNode2 head = new HeroNode2(0,"","");
public HeroNode2 getHead() {
return head;
}
//显示链表
public void list(){
if(head.next == null){
System.out.println("链表为空");
return;
}
HeroNode2 tmp = head.next;
while (true){
if(tmp.next == null){
System.out.println(tmp);
break;
}
System.out.println(tmp);
tmp = tmp.next;
}
}
//不考虑顺序,找到链表的最后节点,将最后的next指向新的节点
public void addHero(HeroNode2 heroNode){
HeroNode2 temp = head;
//遍历链表找到最后一个
while(true){
if(temp.next == null){
break;
}
temp = temp.next;
}
//形成双向链表
temp.next = heroNode;
heroNode.pre = temp;
}
//修改不变
@SuppressWarnings("all")
public void updateHero(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){
//find it
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.name = newHeroNode.name;
temp.nickName = newHeroNode.nickName;
} else {
System.out.printf("Can't find Hero what no is %d ", newHeroNode.no);
}
}
//删除节点
public void deleteHero(int no){
if(head.next == null) return;
HeroNode2 temp = head.next;
boolean flag = false;
while (true){
if(temp == null){
System.out.println("已经遍历完");
break;
}
if(temp.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.printf("The hero you input %d could not be found",no);
}
}
}
class HeroNode2{
public int no;
public String name;
public String nickName;
public HeroNode2 next; //指向下一个节点,默认为null
public HeroNode2 pre; //指向前一个节点,默认为null
//构造器
public HeroNode2(int hNo,String hName,String hNickName) {
this.no = hNo;
this.name = hName;
this.nickName = hNickName;
}
//重写toString
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}