关于java双向链表的增删查改

DBNode.java(创建双向结点)

public class DBNode {
    
    
    String value;
    DBNode pre;
    DBNode next;


    public DBNode(String value, DBNode pre, DBNode next) {
    
    
        this.value = value;
        this.pre = pre;
        this.next = next;
    }

//    @Override
//    public String toString() {
    
    
//        return "DBNode{" +
//                "value='" + value + '\'' +
//                ", pre=" + pre +
//                ", next=" + next +
//                '}';
//    }
@Override
public String toString() {
    
    //去掉了访问前驱结点,否则会相互循环打印前驱结点
    return "DBNode{" +
            "value='" + value + '\'' +
            ", next=" + next +
            '}';
}
}

DBNodeDemo.java(创建双向链表)

public class DBNodeDemo {
    
    
    public static void main(String[] args) {
    
    
        DBNode dbNode1 = new DBNode("1", null, null);
        DBNode dbNode2 = new DBNode("2", dbNode1, null);
        DBNode dbNode3 = new DBNode("3", dbNode2, null);
        DBNode dbNode4 = new DBNode("4", dbNode3, null);
//  //实现1-->2-->3-->4的双向链表
//       //     1<--2<--3<--4
        dbNode1.next=dbNode2;
        dbNode2.next=dbNode3;
        dbNode3.next=dbNode4;

//实现双向循环链表
//        dbNode1.pre=dbNode4;
//        dbNode4.next=dbNode1;
        System.out.println(dbNode1);
        //   @Override
        //    public String toString() {
    
    
        //        return "DBNode{" +
        //                "value='" + value + '\'' +
        //                ", pre=" + pre +
        //                ", next=" + next +
        //                '}';
        //    }
        //若前面toString()的方法不变
        //此输出结果会爆栈StackOverflowError,
        //因执行dbNode1的后驱指向dbNode2,dbNode2的前驱指向dbNode1,不断循环往复。

    }
}

MyDBLinked.java(创建头、尾结点和链表大小成员属性,创建增删查改add,remove,set,find成员方法)

public class MyDBLinked {
    
    

    private DBNode head;//头结点
    private DBNode end;//尾结点
    private int size;

    public MyDBLinked() {
    
    
    }

    public MyDBLinked(DBNode head, DBNode end, int size) {
    
    
        this.head = head;
        this.end = end;
        this.size = size;
    }

    @Override
    public String toString() {
    
    
        return "MyDBLinked{" +
                "head=" + head +
                ", end=" + end +
                ", size=" + size +
                '}';
    }

    /*添加方法*/
    public boolean add(String str) {
    
    
        //若原来的链表为空
        if (head == null) {
    
    
            head = new DBNode(str, null, null);//新创建一个节点,将其视为头结点
            end = head;//因只有一个节点,头结点也是尾节点
            size++;
            return true;
        }

        //若原来的链表不为空
        DBNode node = new DBNode(str, end, null);//创建一个新节点,并将新节点的前驱指向原来end节点的数据域
        end.next = node;//将原来尾结点的后驱指向新创建节点的数据域
        end = node;//将新节点赋值为end节点,也可理解为将end引用指向新创建的节点
        size++;
        return true;
    }

    /*删除方法*/
    public String remove(String str) {
    
    
        if (size == 0) throw new RuntimeException("dblinked is null!");

        //删除的是头结点
        if (head.value.equals(str)) {
    
    
            head = head.next;
            if (size == 0) {
    
    
                end = null;
            } else {
    
    
                //若原链表多余一个节点,需把后移的头结点的前驱指向删除,便于GC
                head.pre = null;
            }
            size--;
            return str;
        }

        //删除的不是头结点
        DBNode mid = head;
        while (head.next != null && !mid.next.value.equals(str)) {
    
    
            mid = mid.next;
        }

        //删除的是尾结点
        if (mid.next.next == null) {
    
    
            mid.next = null;
            end = mid;
            size--;
            return str;
        }

        //没找到
        if (mid.next == null) {
    
    
            return null;
        }

        //找到,mid是要删除节点的前一个节点
        mid.next = mid.next.next;
        size--;
        return str;
    }

    /*修改方法*/
    public boolean set(String oldstring, String newstring) {
    
    
        if (size == 0 || head == null) throw new RuntimeException("dblinked is null!");

        //如果修改的头结点是头结点
        if (head.value.equals(oldstring)) {
    
    
            head.value = newstring;
            return true;
        }
        //修改的不是头结点
        DBNode mid = head;
        while (head.next.value != null && !mid.next.value.equals(oldstring)) {
    
    
            mid = mid.next;
        }

        //
        if (mid.next == null) {
    
    
            return false;
        }

        mid.next.value = newstring;
        return true;
    }


    /*查找方法*/
    public boolean find(String str) {
    
    
        if (size == 0 && head == null) throw new RuntimeException("dblinked is null!");
        //查找的元素值是头结点
        if (head.value.equals(str)) {
    
    
            return true;
        }
        //查找的元素值不是头结点
        DBNode mid = head;
        //当下一个节点不为空并且下一个节点的值不等于目标元素值,继续找下一个节点
        while (mid.next != null && !mid.next.value.equals(str)) {
    
    
            mid = mid.next;
        }

        if (mid.next == null) {
    
    
            return false;
        }
                 return true;
    }
}

MyDBLinkedTest.java(实现主类)

public class MyDBLinkedTest {
    
    
    public static void main(String[] args) {
    
    

        MyDBLinked myDBLinked = new MyDBLinked();
        myDBLinked.add("ff");
        myDBLinked.add("hh");
        myDBLinked.add("yy");
        myDBLinked.add("ll");
        System.out.println(myDBLinked);


//        myDBLinked.remove("yy");
//        System.out.println(myDBLinked);
//        myDBLinked.remove("ff");
//        System.out.println(myDBLinked);
//        myDBLinked.remove("ll");
//        System.out.println(myDBLinked);

        myDBLinked.set("ff","oo");
        System.out.println("改变元素值ff为oo后:"+myDBLinked);
        myDBLinked.set("yy","pp");
        System.out.println("改变元素值yy为pp后:"+myDBLinked);
        myDBLinked.set("ll","qq");
        System.out.println("改变元素值ll为qq后:"+myDBLinked);
        System.out.println("——————————————————————————");
        System.out.println("是否找到字符串oo:"+myDBLinked.find("oo"));
        System.out.println("是否找到字符串pp:"+myDBLinked.find("pp"));
        System.out.println("是否找到字符串qq:"+myDBLinked.find("qq"));
        System.out.println("是否找到字符串xfgj:"+myDBLinked.find("xfgj"));

    }
}

结果输出:

MyDBLinked{
    
    head=DBNode{
    
    value='ff', next=DBNode{
    
    value='hh', next=DBNode{
    
    value='yy', next=DBNode{
    
    value='ll', next=null}}}}, end=DBNode{
    
    value='ll', next=null}, size=4}
改变元素值ff为oo后:MyDBLinked{
    
    head=DBNode{
    
    value='oo', next=DBNode{
    
    value='hh', next=DBNode{
    
    value='yy', next=DBNode{
    
    value='ll', next=null}}}}, end=DBNode{
    
    value='ll', next=null}, size=4}
改变元素值yy为pp后:MyDBLinked{
    
    head=DBNode{
    
    value='oo', next=DBNode{
    
    value='hh', next=DBNode{
    
    value='pp', next=DBNode{
    
    value='ll', next=null}}}}, end=DBNode{
    
    value='ll', next=null}, size=4}
改变元素值ll为qq后:MyDBLinked{
    
    head=DBNode{
    
    value='oo', next=DBNode{
    
    value='hh', next=DBNode{
    
    value='pp', next=DBNode{
    
    value='qq', next=null}}}}, end=DBNode{
    
    value='qq', next=null}, size=4}
——————————————————————————
是否找到字符串oo:true
是否找到字符串pp:true
是否找到字符串qq:true
是否找到字符串xfgj:false

猜你喜欢

转载自blog.csdn.net/gy99csdn/article/details/113531139