1. 程式人生 > 其它 >java--演算法--雙向連結串列

java--演算法--雙向連結串列

  1. 雙向連結串列建立:
  2. 雙向連結串列的實際應用:

  3. package com.model.linkedlist.doubly;
    
    /**
     * @Description:測試類
     * @Author: 張紫韓
     * @Crete 2021/7/9 9:57
     * 雙向連結串列的介紹
     */
    public class DoublyLinkedListDemo01 {
        public static void main(String[] args) {
            DoublyLinkedList list=new DoublyLinkedList();
            list.add(
    new Node(1,"a")); list.add(new Node(2,"a")); list.add(new Node(3,"a")); list.add(new Node(4,"a")); list.add(new Node(5,"a")); list.show(); list.delete(new Node(1,"a")); list.show(); list.update(new Node(2,"張紫韓")); list.show(); DoublyLinkedList list1
    = new DoublyLinkedList(); list1.addInOrder(new Node(3,"a")); list1.addInOrder(new Node(2,"a")); list1.addInOrder(new Node(1,"a")); list1.addInOrder(new Node(4,"a")); System.out.println("按順序新增節點"); list1.show(); } } //雙向連結串列類 class DoublyLinkedList{
    private Node head=new Node(); public Node getHead() { return head; } //新增元素,到連結串列的最後端 public void add(Node node){ Node temp=head; while(true){ if (temp.next==null){ break; } temp=temp.next; } temp.next=node; node.pre=temp; } // 按這id號的大小進行新增 public void addInOrder(Node node){ Node temp=head; boolean flag=false;//是否可以進行新增 while(true){ if (temp.next==null){ break; } if (temp.next.id>node.id){ break; } if (temp.next.id==node.id){ flag=false; break; } temp=temp.next; } if (flag){ System.out.println("已經存在此節點,不能進行重複的新增"); }else { //判斷是加在連結串列的最後還是連結串列的中間部分 if (temp.next==null) { temp.next = node; node.pre = temp; }else { node.next = temp.next; node.pre = temp; temp.next = node; node.next.pre = node; } } } //刪除元素 public void delete(Node node){ if (isEmpty()){ System.out.println("連結串列為空不能進行刪除"); return; } Node temp=head.next; boolean flag=false; while (true){ if (temp==null){ break; } if (temp.id==node.id){ flag=true; break; } temp=temp.next; } if (flag){ temp.pre.next=temp.next; temp.next.pre=temp.pre; }else { System.out.println("沒有找到此節點不能進行刪除"); } } // 修改節點 public void update(Node node){ if (isEmpty()){ System.out.println("連結串列為空,不能進行修改"); return; } Node temp=head.next; boolean flag=false; while (true){ if (temp==null){ break; } if (temp.id==node.id){ flag=true; break; } temp=temp.next; } if (flag){ temp.name=node.name; }else { System.out.println("沒有找到此節點,不能進行修改"); } } // 遍歷連結串列 public void show(){ Node temp=head.next; while(true){ if (temp==null){ break; } System.out.println(temp.toString()); temp=temp.next; } } public boolean isEmpty(){ if (head.next==null){ return true; } return false; } } //雙向連結串列的節點類 class Node{ public int id; public String name; public Node pre; public Node next; public Node() { } @Override public String toString() { return "Node{" + "id=" + id + ", name='" + name + '\'' + '}'; } public Node(int id, String name) { this.id = id; this.name = name; } }