雙向鏈表的增刪改查功能
package com.zhiyang.linkedlist;
public class DoubleLinkedListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
HeroNode2 hero1 = new HeroNode2(1, "song", "及時(shí)雨");
HeroNode2 hero2 = new HeroNode2(2, "盧俊義", "玉麒麟");
HeroNode2 hero3 = new HeroNode2(3, "吳用", "智多星");
HeroNode2 hero4 = new HeroNode2(4, "林沖", "豹子頭");
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
// doubleLinkedList.addNode(hero1);
// doubleLinkedList.addNode(hero2);
// doubleLinkedList.addNode(hero3);
// doubleLinkedList.addNode(hero4);
doubleLinkedList.addByOrder(hero1);
doubleLinkedList.addByOrder(hero4);
doubleLinkedList.addByOrder(hero3);
doubleLinkedList.addByOrder(hero2);
doubleLinkedList.showList();
// HeroNode2 newnode=new HeroNode2(4, "公孫勝", "入云龍");
// doubleLinkedList.update(newnode);
// doubleLinkedList.showList();
}
}
class DoubleLinkedList {
private HeroNode2 head = new HeroNode2(0, "", "");
public HeroNode2 getHead() {
return head;
}
// 鏈表遍歷
public void showList() {
// 判斷鏈表是否為空
if (head.next == null) {
return;
}
HeroNode2 tempHeroNode = head.next;
while (true) {
// 判斷是否已經(jīng)到達(dá)最后一個(gè)節(jié)點(diǎn)
if (tempHeroNode == null) {
break;
}
// 打印
System.out.println(tempHeroNode);
//
tempHeroNode = tempHeroNode.next;
}
}
public void addNode(HeroNode2 heronode) {
HeroNode2 tempHeroNode = head;
while (true) {
// 獲取最后的節(jié)點(diǎn)
if (tempHeroNode.next == null) {
break;
}
tempHeroNode = tempHeroNode.next;
}
// 將最后節(jié)點(diǎn)的next
tempHeroNode.next = heronode;
heronode.pre = tempHeroNode;
}
//
// 根據(jù)編號(hào)添加節(jié)點(diǎn)
public void addByOrder(HeroNode2 heronode) {
HeroNode2 tmpHeroNode = head;
boolean flag = false;
while (true) {
// 如果是最后一個(gè)節(jié)點(diǎn),證明需要插入到最后,直接退出
if (tmpHeroNode.next == null) {
break;
}
// 找到插入位置
if (tmpHeroNode.next.no > heronode.no) {
break;
} else if (tmpHeroNode.next.no == heronode.no) {
flag = true;
break;
}
tmpHeroNode = tmpHeroNode.next;
}
// 判斷是否能夠插入
if (flag) {
System.out.println("待插入節(jié)點(diǎn)已存在");
} else {
heronode.next = tmpHeroNode.next;
tmpHeroNode.next = heronode;
heronode.pre = tmpHeroNode;
}
}
// 節(jié)點(diǎn)內(nèi)容修改
// 修改節(jié)點(diǎn)信息,編號(hào)不能變
// 根據(jù)節(jié)點(diǎn)編號(hào)修改
public void update(HeroNode2 newheroNode) {
// 判斷鏈表是否為空
if (head.next == null) {
System.out.println("鏈表為空");
return;
}
HeroNode2 tmpHeroNode = head.next;
boolean flag = false;
while (true) {
if (tmpHeroNode == null) {
break;
}
if (tmpHeroNode.no == newheroNode.no) {
flag = true;
break;
}
tmpHeroNode = tmpHeroNode.next;
}
if (flag) {
tmpHeroNode.name = newheroNode.name;
tmpHeroNode.nickname = newheroNode.nickname;
} else {
System.out.printf("編號(hào)為%d的節(jié)點(diǎn)不存在\n", newheroNode.no);
}
}
// 從雙向鏈表中刪除一個(gè)節(jié)點(diǎn)
public void deletenode(int no) {
if (head.next == null) {
System.out.println("鏈表為空");
return;
}
// 找到需要?jiǎng)h除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)。
HeroNode2 tmpHeroNode = head.next;
boolean flag = false;
while (true) {
if (tmpHeroNode == null) {
break;
}
if (tmpHeroNode.no == no) {
flag = true;
break;
}
tmpHeroNode = tmpHeroNode.next;
}
if (flag) {
tmpHeroNode.pre.next = tmpHeroNode.next;
// 如果是最后一個(gè)節(jié)點(diǎn)就不能執(zhí)行下面這句,否則會(huì)執(zhí)行空指針異常
if (tmpHeroNode.next != null) {
tmpHeroNode.next.pre = tmpHeroNode.pre;
}
} else {
System.out.printf("編號(hào)為%d的節(jié)點(diǎn)不存在,無(wú)法刪除\n", no);
}
}
}
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) {
super();
this.no = no;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
return "HeroNode2 [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}