双向链表增、删、改、按序号插入(java)

简介: 双向链表增、删、改、按序号插入(java)

节点

 
public class DoubleHeroNode {
    public int no;
    public String name;
    public String nickname;
    //后一个节点
    public DoubleHeroNode next;
    //前一个节点
    public DoubleHeroNode pre;
 
    public DoubleHeroNode(int hNo, String hName, String hNickname) {
        no = hNo;
        name = hName;
        nickname = hNickname;
    }
 
    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
 
                '}';
    }
}

双向链表

 
 
public class DoubleLinkedList {
    //初始化一个头结点,头结点作为一个标志位
    private DoubleHeroNode head = new DoubleHeroNode(0, "", "");
 
 
    public DoubleHeroNode getHead() {
        return head;
    }
 
    public void list() {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        DoubleHeroNode temp = head.next;
        while (true) {
            //判断是否到链表的最后
            if (temp == null) {
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }
 
    /**
     * 添加一个节点
     *
     * @param doubleHeroNode
     */
    public void add(DoubleHeroNode doubleHeroNode) {
        DoubleHeroNode temp = head;
        while (true) {
            if (temp.next == null) {
                temp.next = doubleHeroNode;
                doubleHeroNode.pre = temp;
                break;
            }
            temp = temp.next;
        }
    }
 
    //修改节点,编号不能修改
    public void update(DoubleHeroNode newDoubleHeroNode) {
        DoubleHeroNode tem = head.next;
        while (true) {
            if (tem == null) {
                break;
            }
            if (tem.no == newDoubleHeroNode.no) {
                tem.nickname = newDoubleHeroNode.nickname;
                tem.name = newDoubleHeroNode.name;
                break;
            }
            tem = tem.next;
        }
    }
 
    public void delete(int no) {
        if (head.next == null) {
            return;
        }
        DoubleHeroNode tem = head.next;
        while (true) {
            if (tem == null) {
                break;
            }
            if (tem.no == no) {
                tem.pre.next = tem.next;
                //tem不是最后一个节点
                if (tem.next != null) {
                    tem.next.pre = tem.pre;
                }
                break;
            }
            tem = tem.next;
        }
    }
 
    //按照排序添加
    public void addByOrder(DoubleHeroNode doubleHeroNode) {
        DoubleHeroNode temp = head.next;
        if (temp == null) {
            head.next = doubleHeroNode;
            doubleHeroNode.pre = head;
            return;
        }
        //是否找到
        boolean flag = false;
        int no = doubleHeroNode.no;
        while (true) {
            if (no < temp.no) {
                flag = true;
                break;
            }
            if (temp.next != null) {
                temp = temp.next;
            } else {
                break;
            }
        }
 
        if (flag) {
            //插入到中间
            doubleHeroNode.next = temp;
            doubleHeroNode.pre = temp.pre;
            temp.pre.next=doubleHeroNode;
            temp.pre = doubleHeroNode;
        } else {
            //插入到末尾
            temp.next = doubleHeroNode;
            doubleHeroNode.pre = temp;
        }
    }
}

测试

 
 
public class DoubleLinkedListDemo {
    public static void main(String[] args) {
        //DoubleLinkedList linkedList=new DoubleLinkedList();
        //linkedList.add(new DoubleHeroNode(1,"宋江",""));
        //linkedList.add(new DoubleHeroNode(2,"卢俊义",""));
        //linkedList.add(new DoubleHeroNode(3,"吴用",""));
        //linkedList.add(new DoubleHeroNode(4,"林冲",""));
        //linkedList.delete(2);
        //linkedList.list();
 
        DoubleLinkedList linkedList2=new DoubleLinkedList();
 
        linkedList2.addByOrder(new DoubleHeroNode(2,"卢俊义",""));
        linkedList2.addByOrder(new DoubleHeroNode(1,"宋江",""));
        linkedList2.addByOrder(new DoubleHeroNode(9,"吴用",""));
        linkedList2.addByOrder(new DoubleHeroNode(4,"林冲",""));
        linkedList2.addByOrder(new DoubleHeroNode(3,"吴用",""));
        linkedList2.list();
        //System.out.println();
        //linkedList2.reversePrint();
        //linkedList2.list();
        //linkedList2.reverse();
        //linkedList2.list();
 
    }
}
相关文章
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
343 0
|
存储 Java
|
存储 Java
java实现双向链表的增删改查
这篇文章展示了如何在Java中实现双向链表的增加、删除、修改和查询操作,并通过代码示例演示了在双向链表中存储和操作学生信息的过程。
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
186 0
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
141 0
|
算法 Java
Java数据结构与算法:双向链表
Java数据结构与算法:双向链表
HashTab基于链表简单实现(java,不包含扩容)
HashTab基于链表简单实现(java,不包含扩容)
单向环形链表-约瑟夫问题(java)
单向环形链表-约瑟夫问题(java)
环形数组链表(java)
环形数组链表(java)