双向链表
这是一个java的双向链表的代码实现,这里简单实现了双向链表的节点创建(不同与单链表的时多了一个指向上一个节点的指针),双向链表的建立,节点的添加,链表的遍历,节点的修改,节点删除。
代码中还包括双向链表的各个功能的测试。
public class DoubleLinkedListDemo {
public static void main(String[] args) {
System.out.println("双向链表的测试!!!");
HeroNode2 hero1 = new HeroNode2(1,"宋江","及时雨");
HeroNode2 hero2 = new HeroNode2(2,"卢俊义","玉麒麟");
HeroNode2 hero3 = new HeroNode2(3,"吴用","智多星");
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();//首先先创建一个双向链表
doubleLinkedList.add(hero1);
doubleLinkedList.add(hero2);
doubleLinkedList.add(hero3);
doubleLinkedList.list();
HeroNode2 hero9 = new HeroNode2(3,"大吴用","小智多星");
doubleLinkedList.update(hero9);
System.out.println("显示修改后的双向链表。");
doubleLinkedList.list();
doubleLinkedList.del(5);
System.out.println("显示删除后的双向链表。");
doubleLinkedList.list();
}
}
class DoubleLinkedList{
private HeroNode2 head = new HeroNode2(0,"","");
public HeroNode2 getHead() {
return head;
}
//遍历双向链表
public void list(){
if (head.next == null){
return ;
}
HeroNode2 temp = head.next;
while(true){//是否到最后
if (temp == null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
//双向链表添加节点到最后
public void add(HeroNode2 heroNode2){
HeroNode2 temp = head;//因为head节点不能动,因此需要一个辅助遍历temp
while(true){//找到链表最后
if(temp.next == null){
break;
}
temp=temp.next; //没找到 temp后移
}
//当退出while时 temp指向最后
//将最后这个节点的next,指向新节点
temp.next = heroNode2;
heroNode2.pre = temp;
}
//双向链表修改节点
public void update(HeroNode2 newHeroNode2){
if (head.next == null){ //判空。
System.out.printf("链表为空。。。、\n");
return;
}
//找到需要修改的节点
HeroNode2 temp = head.next;
boolean flag = false;
while(true){
if (temp == null){
break;//遍历完成。
}
if (newHeroNode2.no == temp.no)
{
flag = true;
break;
}else temp=temp.next;
}
//根据flag判断是否找到
if (flag)
{
temp.name = newHeroNode2.name;
temp.nickname = newHeroNode2.nickname;
}else {
System.out.printf("没有找到。。编号%d",newHeroNode2.no);
}
}
//删除
public void del(int no){
if (head.next == null){
System.out.println("kong!!");
return;
}
HeroNode2 temp=head;//辅助节点
boolean flag = false;
while(true){
if (temp == null){
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("要删除节点%%d不存在!!!、\n",no);
}
}
}
class HeroNode2 {//创建HeroNode2节点
public int no;
public String name;
public String nickname;
public HeroNode2 next;
public HeroNode2 pre;// 指向上一个节点,默认null;
public HeroNode2(int no,String name,String nickname){
this.no = no;
this.name = name;
this.nickname = nickname;
}
public String toString(){
return "HeroNode[ no="+ no + ", name ="+ name +", nickname ="+nickname+".]";
}
}