具体实现如下:
package link;
import org.junit.Test;
//双向链表
public class DoubleLinkedList {
@Test
public void test(){
//创建一个单链表
DoubleSingLinkList list = new DoubleSingLinkList(); //已经加载了头节点
//创建英雄节点
HeroNodeT hero1 = new HeroNodeT(1, "宋江", "及时雨");
HeroNodeT hero2 = new HeroNodeT(2, "卢俊义", "玉麒麟");
HeroNodeT hero3 = new HeroNodeT(3, "吴用", "智多星");
HeroNodeT hero4 = new HeroNodeT(4, "林冲", "豹子头");
HeroNodeT hero5 = new HeroNodeT(5, "玛丽亚", "***");
list.add(hero1);
list.add(hero2);
list.add(hero3);
list.add(hero4);
list.add(hero5);
System.out.println("修改前:");
list.show();
System.out.println("修改后:");
list.update(new HeroNodeT(3, "玛丽亚","杰克森"));
list.saveOrUpdate(new HeroNodeT(6, "强生","泰坦"));
list.show();
System.out.println("删除后:");
list.delete(2);
list.show();
}
}
//定义一个双向链表
class DoubleSingLinkList {
//定义一个头节点 方便找到初始位置
HeroNodeT headNode = new HeroNodeT(); //头节点 里面不要任何的数据 单纯的定位
public HeroNodeT getHeadNode() {
return headNode;
}
//删除方法
public void delete(int no){
HeroNodeT t=getHeadNode();
while ((t=t.next)!=null){
if(t.no==no){
//找到要删除的节点
t.pre.next=t.next; //当前节点 t-1 -> t+1
t.next.pre=t.pre.pre;// t+1 -> t-1
return;
}
}
System.out.println("没有找到no:"+no);
}
//修改节点 跟单链表一样
public void update(HeroNodeT nodeT){
HeroNodeT t=getHeadNode();
while ((t=t.next)!=null){
if(t.no==nodeT.no){
t.name= nodeT.name;
t.nickName= nodeT.nickName;
System.out.println(nodeT.no+"修改成功");
return;
}
}
System.out.println("没有找到no:"+nodeT.no);
}
//修改节点 跟单链表一样
public void saveOrUpdate(HeroNodeT nodeT){
HeroNodeT t=getHeadNode();
while ((t=t.next)!=null){
if(t.no==nodeT.no){
t.name= nodeT.name;
t.nickName= nodeT.nickName;
System.out.println(nodeT.no+"修改成功");
return;
}
}
System.out.println("没有找到no,正在添加"+nodeT.no);
add(nodeT);
}
//添加节点 默认添加到最后
public void add(HeroNodeT nodeT) {
//首先要找到最后一个节点 如果最后一个节点.next==null 那么这个就是最后节点
HeroNodeT temp = headNode; //定义一个辅助遍历,因为头节点不能动,类似于指针
while (true) {
if (temp.next == null) { //找到最后节点
break;
}
temp = temp.next; //依次往后遍历
}
temp.next=nodeT;
nodeT.pre=temp;
}
//遍历所有节点
public void show() {
if (headNode.next == null) {
System.out.println("空数据~~~~~");
return;
}
HeroNodeT temp = headNode; //定义一个辅助遍历,因为头节点不能动,类似于指针
while ((temp = temp.next) != null) {
System.out.println(temp.toString());
}
}
}
//定义一个英雄节点
class HeroNodeT {
public int no;
public String name;
public String nickName; //昵称
public HeroNodeT next; //默认是null
public HeroNodeT pre; //默认是null
public HeroNodeT() {
}
public HeroNodeT(int no, String name, String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
@Override
public String toString() {
return "HeroNodeT{" + "no=" + no + ", name='" + name + '\'' + ", nickName='" + nickName + "}'";
}
}