package Java_Algorithm.LinkList;
import org.junit.Test;
/**
* ClassName: DoubleLinkedList
* Date: 2020/3/16 19:16
* author: Oh_MyBug
* version: V1.0
*
* 管理單向鏈表的缺點分析:
* 1. 單向鏈表,查找的方向只能是一個方向,而雙向鏈表可以向前或者向後查找
* 2. 單向鏈表不能自我刪除,需要靠輔助節點,而雙向鏈表可以自我刪除,所以在單向鏈表刪除節點時,
* 總是找到temp,temp是待刪除節點的前一個節點
*
* 使用帶head頭的雙向鏈表實現 - RunningMan成員關於時間排序
*/
public class DoubleLinkedList {
@Test
public void test(){
DoubleLinkedList runningMan = new DoubleLinkedList();
runningMan.list();
System.out.println("RunningMan開始啦!");
runningMan.add(new MemberNode1(1, "池石鎮","王鼻子"));
runningMan.add(new MemberNode1(2, "劉在石","劉姆斯·邦德"));
runningMan.add(new MemberNode1(3, "金鐘國","能力者"));
runningMan.add(new MemberNode1(4, "Gary","狗哥"));
runningMan.add(new MemberNode1(5, "HAHA","時間支配者"));
runningMan.add(new MemberNode1(7, "李光洙","長頸鹿"));
runningMan.add(new MemberNode1(8, "宋仲基","同齡朋友"));
runningMan.list();
System.out.println("智孝加入!");
runningMan.addById(new MemberNode1(6, "宋智孝","懵智孝"));
runningMan.list();
System.out.println("Lizzy加入!");
runningMan.addById(new MemberNode1(11, "Lizzy","RM的維他命"));
runningMan.list();
System.out.println("Lizzy下車");
runningMan.del(11);
runningMan.list();
System.out.println("宋仲基下車");
runningMan.del(8);
runningMan.list();
System.out.println("金鐘國信息修改");
runningMan.update(new MemberNode1(3, "金鐘國","能力者、斯巴達國斯"));
runningMan.list();
System.out.println("劉在石信息修改");
runningMan.update(new MemberNode1(2, "劉在石","劉姆斯·邦德、螞蚱"));
runningMan.list();
System.out.println("Gary下車");
runningMan.del(4);
runningMan.list();
System.out.println("全昭旻、梁世燦加入");
runningMan.addById(new MemberNode1(10, "梁世燦","小不點"));
runningMan.addById(new MemberNode1(9, "全昭旻","女版李光洙"));
runningMan.list();
System.out.println("RunningMan要一直健健康康下去");
}
private MemberNode1 head = new MemberNode1(0,null,null);
public MemberNode1 getHead() {
return head;
}
// 遍歷雙向鏈表的方法
public void list(){
MemberNode1 h = head;
if (h.getNext() == null){
System.out.println("當前鏈表爲空!");
return;
}
while (h.getNext() != null) {
h = h.getNext();
System.out.println(h.toString());
}
System.out.println();
}
// 添加一個節點到雙向鏈表的最後
public void add(MemberNode1 memberNode){
MemberNode1 h = head;
while (h.getNext() != null) {
h = h.getNext();
}
h.setNext(memberNode);
memberNode.setPre(h);
System.out.println(memberNode.getName() + "添加成功");
}
public void addById(MemberNode1 memberNode) {
MemberNode1 h = head;
while (h.getNext() != null) {
if (h.getNext().getId() < memberNode.getId()) {
h = h.getNext();
continue;
} else if (h.getNext().getId() == memberNode.getId()) {
System.out.println("添加失敗,已有該成員!");
return;
}
break;
}
if (h.getNext() == null){
add(memberNode);
return;
}
h.getNext().setPre(memberNode);
memberNode.setNext(h.getNext());
h.setNext(memberNode);
memberNode.setPre(h);
System.out.println(memberNode.getName() + "添加成功");
}
// 修改一個結點的內容,可以看到雙向鏈表的節點內容修改和單項鍊表一樣
public void update(MemberNode1 memberNode){
MemberNode1 h = head;
while (h.getNext() != null) {
if (h.getNext().getId() != memberNode.getId()) {
h = h.getNext();
continue;
} else if (h.getNext().getId() == memberNode.getId()) {
h.getNext().setInfo(memberNode.getInfo());
System.out.println("修改成功");
return;
}
}
System.out.println("修改失敗,未找到該成員!");
}
// 從雙向鏈表中刪除一個節點
public void del(int id){
MemberNode1 h = head;
while (h.getNext() != null){
h = h.getNext();
if (h.getId() == id)
break;
}
if (h.getNext() == null){
h.getPre().setNext(null);
return;
}
h.getPre().setNext(h.getNext());
h.getNext().setPre(h.getPre());
}
}
class MemberNode1{
private int id;
private String name;
private String info;
private MemberNode1 next;
private MemberNode1 pre;
public MemberNode1(int id, String name, String info) {
this.id = id;
this.name = name;
this.info = info;
this.next = null;
this.pre = null;
}
public MemberNode1(MemberNode1 node) {
this.id = node.id;
this.name = node.name;
this.info = node.info;
this.next = null;
this.pre = null;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public MemberNode1 getNext() {
return next;
}
public void setNext(MemberNode1 next) {
this.next = next;
}
public MemberNode1 getPre() {
return pre;
}
public void setPre(MemberNode1 pre) {
this.pre = pre;
}
@Override
public String toString() {
return "MemberNode1{" +
"id=" + id +
", name='" + name + '\'' +
", info='" + info + '\'' +
'}';
}
}
Java | 雙向鏈表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.