雙向連結串列

小懿同学發表於2024-05-03

雙向連結串列

雙向連結串列的增、刪、改、遍歷思路

1.增加: 在雙向連結串列的末尾增加;

只需找到最後一個結點temp;

temp.next = newNode;

newNode.pre = temp;

2.指定的位置插入

假設插入到index位置,

有兩種情況:①當temp.next.no > index是則找到該位置,temp為該位置的上一個結點

② 遍歷後到了連結串列尾則直接插入連結串列尾部

3.刪除元素

4.修改元素

public class DoubleLinkList {
    public static void main(String[] args) {
        Node nodeA = new Node(1, "aaa", "AAA");
        Node nodeB = new Node(5, "bbb", "BBB");
        Node nodeC = new Node(8, "ccc", "CCC");
        Node nodeD = new Node(9, "ddd", "DDD");
        DoubleLink listArray = new DoubleLink();
        listArray.add(nodeA);
        listArray.add(nodeB);
        listArray.add(nodeC);
        listArray.insert(nodeD,10);
        listArray.getList();
       // listArray.update(nodeD);
//        listArray.delete(nodeC);
//        listArray.getList();
    }
}
class DoubleLink {
    private Node head = new Node(0,"","");
    public Node getHead() {
        return head;
    }

    // 遍歷雙向連結串列
    public void getList() {
        if (head.next == null) {
            System.out.println("連結串列為空");
            return;
        }
        Node temp = head;
        while (temp.next != null) {
            System.out.println(temp.next);
            temp =temp.next;
        }
    }

    // 雙向連結串列中新增元素
    public void add(Node node) {
        Node temp = head;

        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = node; // 在尾部插入要增加的結點
        node.pre = temp;  // 讓新增的結點的pre指向前一個結點
    }

    // 修改雙向連結串列的元素
    public void update(Node node) {
        if (head.next == null) {
            System.out.println("連結串列為空");
            return;
        }
        Node temp = head.next;
        while (temp.no != node.no) {
            if (temp == null) {
                System.out.println("未找到該元素");
              return;
            }
            temp =temp.next;
        }
        temp.name = node.name;
        temp.bName = node.bName;
    }

    // 刪除雙向連結串列的元素
    public void delete(Node node) {
        if (head.next == null) {
            System.out.println("連結串列為空");
            return;
        }
        Node temp = head.next;
        while (temp.no != node.no) {
            if (temp == null) {
                System.out.println("未找到該結點");
                return;
            }
            temp = temp.next;
        }
        temp.pre.next = temp.next; // 要刪除結點的上一個結點next指向要刪除節點的下一個結點

        // 判斷刪除的結點是不是最後一個,如果最後一個則不執行
        if (temp.next != null) {
            temp.next.pre = temp.pre;  //讓當前元素的下一個結點的pre指向當前元素的像一個結點的pre
        }
    }

    // 指定位置插入元素
    public void insert(Node node,int index) {
      Node temp = head;
      boolean flag = false;
      while (true) {
          if (temp.next == null) {
              System.out.println("到尾了,直接插入");
              break;
          } else if (temp.next.no > index) {
              System.out.println("找到了位置");
              break;
          } else if (temp.next.no == index) {
             flag = true;
              break;
          }
          temp = temp.next;
      }
      if (flag) {
          System.out.println("位置已經存在");
      } else {
          /**
           * 先連線後面的
           */
          if (temp.next != null) {
              temp.next.pre = node; // 將後一個元素的pre於當前節點的pre相連
              node.next = temp.next;
          }
          /**
           *  在連線前面的
           */
          temp.next = node;
          node.pre = temp;
      }

    }
}
class Node {
    public int no;
    public String name;
    public String bName;
    public Node pre;  // 指向上一個結點
    public Node next; // 指向下一個結點

    public Node(int no, String name, String bName) {
        this.no = no;
        this.name = name;
        this.bName = bName;
    }

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", bName='" + bName + '\'' +
                '}';
    }
}

相關文章