java链表实现

本文详细介绍了单向链表和双向链表的实现及其在Java中的操作,包括添加、删除、插入、更新和队列反转。通过实例展示了如何在`SingleLinkQueueDemo`和`DoubleLinkQueueDemo`中使用这两种数据结构进行节点操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单向链表

/**
 * 单链表
 */
public class SingleLinkQueueDemo {

    public static void main(String[] args) {
        SingleLinkQueue queue = new SingleLinkQueue();
        AllianceNode node1 = new AllianceNode(1, "压缩");
        AllianceNode node2 = new AllianceNode(2, "永恩");
        AllianceNode node6 = new AllianceNode(6, "刀妹");
        AllianceNode node3 = new AllianceNode(3, "老鼠");
        queue.add(node1);
        queue.add(node2);
        queue.show();
        System.out.println("执行insert测试:");
        queue.insert(node6);
        queue.insert(node3);
        queue.show();
        System.out.println("执行update测试:");
        AllianceNode node61 = new AllianceNode(6, "刀妹厉害");
        queue.update(node61);
        queue.show();
        System.out.println("执行delete测试:");
        queue.delete(2);
        queue.show();
        System.out.println("执行队列反转测试:");
        queue.reverseShow(queue.getHead());
        queue.show();


    }
}

    /**
     * 定义节点类
     */
     class AllianceNode{
        public int id;
        public String name;
        public AllianceNode next;  // 指向下一个节点的指针

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


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

    class SingleLinkQueue{
        // 定义头节点
       private AllianceNode head= new AllianceNode(0,"");

        public AllianceNode getHead() {
            return head;
        }

        public void setHead(AllianceNode head) {
            this.head = head;
        }

        // 添加链表数据
        public void add(AllianceNode node){
            // 定义一个临时变量temp,使其指向链表尾部,然后将node放入next
            AllianceNode temp = head;
            while (true){
                if (temp.next==null){
                    temp.next = node;
                    break;
                }
                temp = temp.next;
            }
        }
        public void show(){
            if (head.next==null){
                System.out.println("链表为空");
                return;
            }
            AllianceNode temp = head.next;
            while (true){
                if (temp==null){
                    break;
                }
                System.out.println(temp);
                temp = temp.next;
            }
        }
        // 插入
        public void insert(AllianceNode allianceNode){
            AllianceNode node = head;
           while (true){
               if (node.next==null){
                   node.next = allianceNode;
                   break;
               }
               if (node.next.id>allianceNode.id){
                   allianceNode.next= node.next;
                   node.next=allianceNode;
                   break;
               }
               if (node.next.id==allianceNode.id){
                   System.out.println("id已存在");
                   break;
               }
               node =node.next;
           }
        }

        // 修改
        public void update(AllianceNode allianceNode){
            AllianceNode temp = head;
            while (true){
                if (temp==null){
                    break;
                }
                if (allianceNode.id==temp.id){
                    temp.name = allianceNode.name;;
                }
                temp = temp.next;
            }
        }
        // 删除
        public void delete(int id){
            AllianceNode temp= head;
            while (true){
                if (temp.next==null){
                    System.out.println("未找到元素");
                    break;
                }
                if (id==temp.next.id){
                    temp.next = temp.next.next;
                    break;
                }
                temp =temp.next;
            }
        }

        /**
         * 思路:每遍历一个节点,就将其取出,并放在新列表的head的最前端,将原来的列表放入这个新节点的next域中
         * @param node
         */
        // 队列反转
        public void reverseShow(AllianceNode node){

            if (node.next==null || node.next.next==null){
                return;
            }

            AllianceNode cur = node.next;
            AllianceNode nextValue = null;
            AllianceNode head = new AllianceNode(0,"");

            while (cur!=null){
                nextValue = cur.next;   // 指针后移
                cur.next = head.next;   // 将head尾部所有节点放到cur的下一个节点中
                head.next = cur;        // 将cur放入head的头节点的末尾
                cur = nextValue;        // 将cur指针后移
            }
            node.next = head.next;      // 将反转队列返回到原队列中

        }

    }

双向链表

思路分析:

  • 1、双向列表遍历和单向列表一样,只是双向列表可以向前遍历
  • 2、双向列表末尾新增
    temp.next = newNode;
    newNode.pre=temp;
  • 3、双向列表的修改:和单列表一样,找到后修改
  • 4、删除,因为是双向列表,可以实现自我删除,不需要向单列表一样需要找到他的前一个元素,temp 被删除元素
    temp.next.pre = temp.pre;
    temp.pre.next = temp.next;
public class DoubleLinkQueueDemo {

    public static void main(String[] args) {
        DoubleLinkQueue queue = new DoubleLinkQueue();
        AllianceNode2 node1 = new AllianceNode2(1, "压缩");
        AllianceNode2 node2 = new AllianceNode2(2, "永恩");
        AllianceNode2 node6 = new AllianceNode2(6, "刀妹");
        AllianceNode2 node3 = new AllianceNode2(3, "老鼠");
        queue.add(node1);
        queue.add(node2);
        queue.show();
        System.out.println("执行insert测试:");
        queue.insert(node6);
        queue.insert(node3);
        queue.show();
        System.out.println("执行update测试:");
        AllianceNode2 node61 = new AllianceNode2(6, "刀妹厉害");
        queue.update(node61);
        queue.show();
        System.out.println("执行delete测试:");
        queue.delete(2);
        queue.show();


    }
}

/**
 * 定义节点类
 */
class AllianceNode2{
    public int id;
    public String name;
    public AllianceNode2 next;  // 指向下一个节点的指针
    public AllianceNode2 pre;  // 指向上一个节点的指针

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


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

class DoubleLinkQueue{
    // 定义头节点
    private AllianceNode2 head= new AllianceNode2(0,"");

    public AllianceNode2 getHead() {
        return head;
    }

    public void setHead(AllianceNode2 head) {
        this.head = head;
    }

    // 添加链表数据
    public void add(AllianceNode2 node){
        // 定义一个临时变量temp,使其指向链表尾部,然后将node放入next
        AllianceNode2 temp = head;
        while (true){
            if (temp.next==null){
                temp.next = node;
                node.pre = temp;
                break;
            }
            temp = temp.next;
        }
    }
    public void show(){
        if (head.next==null){
            System.out.println("链表为空");
            return;
        }
        AllianceNode2 temp = head.next;
        while (true){
            if (temp==null){
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }
    // 插入
    public void insert(AllianceNode2 AllianceNode2){
        AllianceNode2 node = head;
        while (true){
            if (node.next==null){
                node.next = AllianceNode2;
                AllianceNode2.pre = node;
                break;
            }
            if (node.next.id>AllianceNode2.id){
                AllianceNode2.next= node.next;
                AllianceNode2.pre = node;
                node.next.pre=AllianceNode2;    
                node.next=AllianceNode2;
                break;
            }
            if (node.next.id==AllianceNode2.id){
                System.out.println("id已存在");
                break;
            }
            node =node.next;
        }
    }

    // 修改
    public void update(AllianceNode2 AllianceNode2){
        AllianceNode2 temp = head;
        while (true){
            if (temp==null){
                break;
            }
            if (AllianceNode2.id==temp.id){
                temp.name = AllianceNode2.name;;
            }
            temp = temp.next;
        }
    }
    // 删除
    public void delete(int id){
        AllianceNode2 temp= head.next;
        while (true){
            if (temp==null){
                System.out.println("未找到元素");
                break;
            }
            if (id==temp.id){
                temp.pre.next = temp.next;
                if (temp.next!=null){
                    temp.next.pre = temp.pre;
                }
                break;
            }
            temp =temp.next;
        }
    }



}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值