前言
双向链表是一种很常见的链表结构,在java的api中就能看到它,这里使用java对其进行简单的实现。
一、双向链表是什么?
顾名思义,双向链表就是有两个引用,分别指向前一节点和后一节点的一种链式存储结构。
二、双向链表图解
三、双向链表案例
请使用双向链表模拟对水浒传中英雄人物的尾添加,有序添加,修改,删除,打印等操作。
四、代码实现
1.测试代码
代码如下:
package com.yc.linkedlist;
public class DoubleLinkedListDemo {
public static void main(String[] args) {
DoubleLinkedListDemo slld = new DoubleLinkedListDemo();
HeroNode hero1 = slld.new HeroNode(1,"宋江","及时雨");
HeroNode hero2 = slld.new HeroNode(2,"卢俊义","玉麒麟");
HeroNode hero3 = slld.new HeroNode(3,"吴用","智多星");
DoubleLinkedList doubleLinkedList = slld.new DoubleLinkedList();
// doubleLinkedList.add(hero1);
// doubleLinkedList.add(hero2);
// doubleLinkedList.add(hero3);
// doubleLinkedList.list();
System.out.println("有序添加");
doubleLinkedList.addByOrder(hero3);
doubleLinkedList.addByOrder(hero1);
doubleLinkedList.addByOrder(hero2);
doubleLinkedList.list();
System.out.println("修改");
HeroNode newHero = slld.new HeroNode(3,"吴用hh","智多星");
doubleLinkedList.update(newHero);
doubleLinkedList.list();
System.out.println("删除");
doubleLinkedList.delete(2);
doubleLinkedList.list();
}
//双向链表
class DoubleLinkedList {
private HeroNode head = new HeroNode();
/**
* 删除节点
* @param no
*/
public void delete(int no){
if(head.next == null){
return;
}
boolean flag = false;
HeroNode temp = head.next;
while(temp != null){
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;
}
}
return;
}
/**
* 修改节点
* @param hero
*/
public void update(HeroNode hero){
if(head.next == null){
return;
}
boolean flag = false;
HeroNode temp = head.next;
while(temp != null){
if(temp.no == hero.no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.name = hero.name;
temp.nickname = hero.nickname;
}
return;
}
/**
* 有序添加
* @param hero
*/
public void addByOrder(HeroNode hero){
HeroNode temp = head;
while(true){
if(temp.next == null){
break;
}
if(temp.next.no>=hero.no){
break;
}
temp = temp.next;
}
if(temp.next!=null){
temp.next.pre = hero;
hero.next = temp.next;
}
hero.pre = temp;
temp.next = hero;
return;
}
/**
* 尾添加
* @param hero
*/
public void add(HeroNode hero){
HeroNode temp = head;
while(temp.next!=null){
temp = temp.next;
}
temp.next = hero;
hero.pre = temp;
return;
}
/**
* 打印链表
*/
public void list(){
HeroNode temp = head.next;
while(temp!=null){
System.out.println(temp);
temp = temp.next;
}
return;
}
}
//英雄节点
class HeroNode{
private int no;
private String name;
private String nickname;
private HeroNode next;
private HeroNode pre;
public HeroNode(int no, String name, String nickname) {
super();
this.no = no;
this.name = name;
this.nickname = nickname;
}
public HeroNode() {
super();
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public HeroNode getNext() {
return next;
}
public void setNext(HeroNode next) {
this.next = next;
}
public HeroNode getPre() {
return pre;
}
public void setPre(HeroNode pre) {
this.pre = pre;
}
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}
}
2.代码分析
代码共分为三部分,测试代码,双向链表,英雄节点,有兴趣的朋友可以在双向链表部分加入更多的方法。
总结
学了单链表后,感觉双向链表实现起来更为简单,也对链式存储结构有了较为深刻的认识,希望能让更多的朋友一起认识它。