Java | 雙向鏈表

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 + '\'' +
                '}';
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章