双向链表(非环形链表,有头节点)的增删改查

public class DoubleLinkedList {
    
    

    private Node headNode = new Node(0,"head");

    public Node getHeadNode() {
    
    
        return headNode;
    }

    // 1、尾部添加 ---- 与单向链表一样,只不过需将新节点的前引用指向之前的最后一个节点
    public void add(Node node){
    
    
        // 由于不能修改头节点,创建临时节点
        Node temp = headNode;

        while (true){
    
    
            if(temp.next == null) break; // 当节点的下一个节点为空时,说明该节点是尾部节点
            temp = temp.next;
        }
        temp.next = node;
        node.pre = temp;
    }

    // 2、遍历链表
    public void list(){
    
    
        if(headNode.next == null){
    
    
            System.out.println("链表为空~");
            return;
        }
        Node temp = headNode;
        while (true){
    
    
            if(temp.next == null) break; // 节点到达最后,跳出循环
            System.out.println(temp.next);
            temp = temp.next;
        }
    }

   // 3、修改节点 ---- 与单向链表一样
    public void update(Node updateNode){
    
    
        Node temp = headNode.next;
        while (true){
    
    
            if(temp == null){
    
    
                break;
            }
            if(temp.no == updateNode.no){
    
    
                temp.value = updateNode.value;
                System.out.println("编号为" + updateNode.no + "的节点数据修改成功!");
                return;
            }
            temp = temp.next;
        }
        System.out.println("没有找到编号为" + updateNode.no + "的节点,修改失败!");
        return;
    }

    // 4、删除节点 ---- 与单向链表有差别,可以实现自我删除,即不用找删除节点的前一个节点。最后一个节点的删除比较特殊
    public void delete(Node node){
    
    
        Node temp = headNode.next;
        while (true){
    
    
            if(temp == null){
    
    
                break;
            }
            if(temp.no == node.no){
    
    
                temp.pre.next = temp.next;
                if(temp.next != null){
    
    
                    temp.next.pre = temp.pre;
                }
                System.out.println("编号为" + node.no + "的节点删除成功!");
                return;
            }
            temp = temp.next;
        }
        System.out.println("没有找到编号为" + node.no + "的节点,删除失败!");
        return;
    }
}

class Node{
    
    

    public int no; // 编号
    public String value; // 节点数据
    public Node next;  // 下一个节点
    public Node pre;    // 前一个节点

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

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

测试代码:

public class Test {
    
    

    public static void main(String[] args){
    
    

        // 双向链表
        Node node1 = new Node(1,"liubei");
        Node node2 = new Node(2,"guanyu");
        Node node3 = new Node(3,"zhangfei");
        Node node4 = new Node(4,"machao");
        Node node5 = new Node(4,"huangzhong");
        Node node6 = new Node(5,"kongming");
        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
        // 添加
        doubleLinkedList.add(node3);
        doubleLinkedList.add(node1);
        doubleLinkedList.add(node4);
        doubleLinkedList.add(node2);
        // 修改
        doubleLinkedList.update(node5);
        // 删除
        doubleLinkedList.delete(node2);
        doubleLinkedList.list();
   }
}

Guess you like

Origin blog.csdn.net/never_late/article/details/118608045