数据结构6——双向链表

57 阅读1分钟

遍历

遍历和单链表一样,只是可以向前,也可以向后查找

public void list(){
    if (head.next == null) {
        System.out.println("链表为空");
        return;
    }
    Node temp = head.next;
    while(temp != null){
        System.out.println(temp);
        temp = temp.next;
    }
}

添加

添加到双向链表最后

  1. 先找到双向链表的最后节点temp
  2. temp.next = newNode
  3. newNode.pre = temp;
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 addById(Node node){
    if (head.next == null) {
        add(node);
        return;
    }
    Node temp = head;
    while(true){
        if (temp.next == null) {
            break;
        }
        if (node.id <= temp.next.id) {
            node.next = temp.next;
            node.pre = temp;
            temp.next = node;
            temp.next.pre = node;
            return;
        }
        temp = temp.next;
    }
    temp.next = node;
    node.pre = temp;
}

修改

和单链表一样

public void change(int id,String name){
    if (head.next == null) {
        System.out.println("空表");
        return;
    }
    Node temp = head.next;
    while(true){
        if (temp == null){
            break;
        }
        if (temp.id == id){
            temp.name = name;
        }
        temp = temp.next;
    }
}

删除

  1. 找到待删除节点temp
  2. temp.pre.next = temp.next;
  3. temp.next.pre = temp.pre
public void del(int id){
    if (head.next == null) {
        System.out.println("空表");
        return;
    }
    Node temp = head.next;
    while(true){
        if (temp == null){
            break;
        }
        if (temp.id == id) {
            temp.pre.next = temp.next;
            if (temp.next != null){
                temp.next.pre = temp.pre;
            }

            return;
        }
        temp = temp.next;
    }
}

全部代码

package 双向链表;

public class DoubleLinkList {
    public static void main(String[] args) {
        Node node1 = new Node(1,"张小狗子");
        Node node2 = new Node(2,"张中狗子");
        Node node3 = new Node(3,"张大狗子");
        DoubleList list = new DoubleList();
        list.add(node1);
        list.add(node2);
        list.add(node3);
        list.list();
        System.out.println("==========修改==========");
        list.change(2,"狗子");
        list.list();
        System.out.println("==========删除==========");
        list.del(2);
        list.list();
        System.out.println("==========id加==========");
        list.addById(node1);
        list.addById(node3);
        list.addById(node2);
    }
}
class DoubleList {
    private Node head = new Node(1,"狗子");

    public Node getHead() {
        return head;
    }
    public void list(){
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        Node temp = head.next;
        while(temp != null){
            System.out.println(temp);
            temp = temp.next;
        }
    }
    public void add(Node node){
        Node temp = head;
        while(true){
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = node;
        node.pre = temp;
    }
    public void change(int id,String name){
        if (head.next == null) {
            System.out.println("空表");
            return;
        }
        Node temp = head.next;
        while(true){
            if (temp == null){
                break;
            }
            if (temp.id == id){
                temp.name = name;
            }
            temp = temp.next;
        }
    }
    public void del(int id){
        if (head.next == null) {
            System.out.println("空表");
            return;
        }
        Node temp = head.next;
        while(true){
            if (temp == null){
                break;
            }
            if (temp.id == id) {
                temp.pre.next = temp.next;
                if (temp.next != null){
                    temp.next.pre = temp.pre;
                }

                return;
            }
            temp = temp.next;
        }
    }
    public void addById(Node node){
        if (head.next == null) {
            add(node);
            return;
        }
        Node temp = head;
        while(true){
            if (temp.next == null) {
                break;
            }
            if (node.id <= temp.next.id) {
                node.next = temp.next;
                node.pre = temp;
                temp.next = node;
                temp.next.pre = node;
                return;
            }
            temp = temp.next;
        }
        temp.next = node;
        node.pre = temp;
    }
}
class Node {
    public Node pre;
    public int id;
    public String name;
    public Node next;

    public Node(int id, String name) {
        this.id = id;
        this.name = name;
        this.pre = null;
        this.next = null;
    }

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