java实现双向链表的增删改查

本文详细介绍了双向链表的基本操作,包括添加、按顺序添加、修改、删除和显示节点的方法。通过具体代码实现,展示了如何在Java中创建并管理双向链表,适合初学者和需要复习链表操作的开发者。

实现思路:

代码:

 

public class DoubleLinkedList {
    private Person head = new Person(0,"");
    // 获取头结点
    public Person getHead(){
        return head;
    }

    // 添加-- 直接添加,没有按顺序添加
    public void add(Person headNode,Person node){
        if(headNode.next == null){// 只有头结点的时候
            headNode.next = node;
            node.pre = headNode;
            return;
        }
        Person temp = headNode;
        while(true){// 寻找最后一个节点
            if(temp.next == null){// 最后一个节点
                temp.next = node;
                node.pre = temp;
                break;
            }
            temp = temp.next;
        }
    }
    // 按顺序添加节点
    public void addByOrder(Person headNode,Person node){
        /**
         * 1.链表为空的第一个节点插入
         * 2.在中间插入
         * 3.在尾部插入
         */
        boolean flag = true;
        Person temp = headNode.next;
        while(true){
            if(temp == null){// 首节点插入
                headNode.next = node;
                node.pre = headNode;
                flag = false;
                break;
            }
            if(node.id < temp.id){// 中间插入
                temp.pre.next = node;
                node.pre = temp.pre;
                node.next = temp;
                temp.pre =node;
                flag = false;
                break;
            }
            if(node.id == temp.id){ // 已经存在
                System.out.println("节点已存在。。");
                flag = false;
                break;
            }
            if(temp.next == null){// 如果已经没有节点了,就退出
                break;
            }
            temp = temp.next;
        }

        if(flag){// 尾部插入的节点
            temp.next = node;
            node.pre = temp;
        }
    }

    // 修改
    public void update(Person updateNode){
        boolean flag = true;
        Person temp = head.next;
        while(true){
            if(head.next == null){
                throw new RuntimeException("链表为空。。。");
            }

            if(temp.id == updateNode.id){
//                System.out.println(updateNode);
                temp.name = updateNode.name;
                flag = false;
                break;
            }
            temp = temp.next;
        }
        if(flag){
            System.out.println("该节点不存在。。");
        }
    }

    // 删除
    public void delete(int id){
        boolean flag = true;
        Person temp = head.next;
        if(head.next == null){
            throw new RuntimeException("链表为空。。");
        }
        while(temp != null){
            if(temp.id == id){
               if(temp.next == null){// 如果删除的是最后一个的话
                   temp.pre.next = null;
                   temp.pre = null;
                   flag = false;
                   break;
               }else{
                   temp.pre.next = temp.next;
                   temp.pre = temp.next.pre;
                   flag = false;
                   break;
               }
            }
            temp = temp.next;
        }
        if(flag){
            throw new RuntimeException("链表的该节点不存在。。。");
        }
    }

    // 显示
    public void show(Person headNode){
        if(headNode.next == null){
            throw new RuntimeException("运行时异常。。");
        }
        Person temp = headNode.next;
        while( temp != null){
            System.out.println(temp);
            temp = temp.next;
        }
    }

}

节点

public class Person {
    public int id;
    public String name;
    public Person next;
    public Person pre;

    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }

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

测试

public class TestMain {
    public static void main(String[] args) {
        Person person1 = new Person(1,"zs");
        Person person3 = new Person(6,"ww");
        Person person2 = new Person(3,"ls");


       DoubleLinkedList linkedList = new DoubleLinkedList();
       linkedList.addByOrder(linkedList.getHead(),person1);
       linkedList.addByOrder(linkedList.getHead(),person3);
       linkedList.addByOrder(linkedList.getHead(),person2);
       System.out.println("添加以后。。。。");
       linkedList.show(linkedList.getHead());

        System.out.println("修改以后。。。。");
       Person person4 = new Person(3,"zss");
       linkedList.update(person4);
       linkedList.show(linkedList.getHead());
//
       System.out.println("删除以后。。。。");
       linkedList.delete(3);
       linkedList.show(linkedList.getHead());
    }
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值