程序里有几个注释的地方还是需要特别注意的,根据单链表自己的逻辑来写一遍双向链表,可能有几个细节处理的不到位。
package DataStructures.LinkedList;
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, "吴用", "智多星");
HeroNode2 hero4 = new HeroNode2(4, "林冲", "豹子头");
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
doubleLinkedList.add(hero1);
doubleLinkedList.add(hero2);
doubleLinkedList.add(hero3);
doubleLinkedList.add(hero4);
doubleLinkedList.list();
HeroNode2 newHeroNode = new HeroNode2(4,"公孙胜","入云龙");
doubleLinkedList.updata(newHeroNode);
doubleLinkedList.list();
doubleLinkedList.delete(1);
doubleLinkedList.list();
}
}
class DoubleLinkedList{
private HeroNode2 head = new HeroNode2(0,"","");
public HeroNode2 getHead() {
return head;
}
public void delete(int no){
if (head.next == null){
System.out.println("链表为空,无法删除");
}
HeroNode2 temp = head.next;
boolean flag = false;
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;
}
System.out.println("节点删除成功\n");
}else {
System.out.printf("没找到编号为 %d 的节点!删除失败\n",no);
}
}
public void updata(HeroNode2 heroNode){
if (head.next == null){
System.out.println("链表为空位,无法修改");
return;
}
HeroNode2 temp = head.next;
boolean flag = false;
while(true){
if (temp == null){
break;
}
if (temp.no == heroNode.no){
flag = true;
break;
}
temp = temp.next;
}
if (flag){
temp.name = heroNode.name;
temp.nickname = heroNode.nickname;
}else {
System.out.printf("没找到 编号为 %d 的节点\n",heroNode.no);
}
}
public void add(HeroNode2 newHeroNode){
HeroNode2 temp = head;
while(true){
if (temp.next == null){
break;
}
temp = temp.next;
}
temp.next = newHeroNode;
newHeroNode.pre = temp;
}
public void list(){
if (head.next == null){
System.out.println("链表为空");
return;
}
HeroNode2 temp = head.next;
while (temp != null){
System.out.println(temp);
temp = temp.next;
}
}
}
class HeroNode2{
public int no;
public String name;
public String nickname;
public HeroNode2 next;
public HeroNode2 pre;
public HeroNode2(int no, String name, String nickname) {
this.no = no;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
return "HeroNode2{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
加一个添加的时候根据no排序
public void addByOrder(HeroNode2 newHeroNode){
HeroNode2 temp = head;
boolean flag = false;
while (true){
if (temp.next == null){
break;
}
if (temp.next.no > newHeroNode.no){
break;
}else if (temp.next.no == newHeroNode.no){
flag = true;
break;
}
temp = temp.next;
}
if (flag){
System.out.printf("编号 %d 已存在,不能添加\n",newHeroNode.no);
}else {
if (temp.next != null) {
temp.next.pre = newHeroNode;
newHeroNode.next = temp.next;
}
temp.next = newHeroNode;
newHeroNode.pre = temp;
}
}
测试
doubleLinkedList.addByOrder(hero1);
doubleLinkedList.addByOrder(hero4);
doubleLinkedList.addByOrder(hero2);
doubleLinkedList.addByOrder(hero3);
doubleLinkedList.list();
结果:
双向链表的测试
HeroNode2{no=1, name='宋江', nickname='及时雨'}
HeroNode2{no=2, name='卢俊义', nickname='玉麒麟'}
HeroNode2{no=3, name='吴用', nickname='智多星'}
HeroNode2{no=4, name='林冲', nickname='豹子头'}