双链表基本操作的java代码实现(双链表的创建【头插法】【尾插法】、查找、插入、删除操作)

双链表节点定义

/**
 * className:DLinkList
 *
 * @author:zjl
 * @version:0.1
 * @date:2020/7/1012:49
 * @since:jdk1.8
 */
public class DLinkList {
     

    private Node p;

    /**
     * 创建一个头节点
     * 初始化链表
     * @param p
     */
    public DLinkList() {
     
        this.p = new Node(null,null,null);
    }


    public Node getP() {
     
        return p;
    }

    public void setP(Node p) {
     
        this.p = p;
    }
}

双链表结构定义

/**
 * className:DLinkList
 *
 * @author:zjl
 * @version:0.1
 * @date:2020/7/1012:49
 * @since:jdk1.8
 */
public class DLinkList {
     

    private Node p;

    /**
     * 创建一个头节点
     * 初始化链表
     * @param p
     */
    public DLinkList() {
     
        this.p = new Node(null,null,null);
    }


    public Node getP() {
     
        return p;
    }

    public void setP(Node p) {
     
        this.p = p;
    }
}

双链表工具类

/**
 * className:DLinkListUtil
 *
 * @author:zjl
 * @version:0.1
 * @date:2020/7/1012:52
 * @since:jdk1.8
 */
public class DLinkListUtil {
     


    /**
     * 尾插
     */
    public void TInsert(Object obj,DLinkList dl){
     
        //找到尾结点
        Node q = dl.getP();
        while (q.getNext()!=null){
     
            q = q.getNext();
        }
        //创建新节点存入数据并插入
        Node node = new Node(q, obj, null);
        q.setNext(node);
    }

    /**
     * 头插
     * @param obj
     * @param dl
     */
    public void HInsert(Object obj,DLinkList dl){
     
        //创建新节点存入数据并插入
        Node node = new Node(dl.getP(), obj, dl.getP().getNext());
        dl.getP().setNext(node);
        if(node.getNext()!=null)
            node.getNext().setPre(node);
    }

    /**
     * 查找,未找到返回一个空Node
     * @param obj
     * @param dl
     * @return
     */
    public Node FindElem(Object obj,DLinkList dl){
     
        Node q = dl.getP();
        while (q!=null&&!obj.equals(q.getData())){
     
            q = q.getNext();
        }
        if(q==null){
     
            System.out.println("未找到!");
            return dl.getP();
        }
        return q;
    }

    /**
     * 将元素插入指定链表的指定节点节点后
     * @param obj   元素
     * @param node 指定节点
     * @param dl    指定链表
     */
    public void insert(Object obj,Node node,DLinkList dl){
     
        Node nd = new Node(node, obj, node.getNext());
        node.getNext().setPre(nd);
        node.setNext(nd);
    }

    /**
     * 删除指定节点
     * @param node
     */
    public void delete(Node node){
     
        node.getPre().setNext(node.getNext());
        node.getNext().setPre(node.getPre());
        try {
     
            node.finalize();//内存回收
        } catch (Throwable throwable) {
     
            throwable.printStackTrace();
        }
    }

    /**
     * 遍历显示
     * @param dl
     */
    public void show(DLinkList dl){
     
        Node q = dl.getP();
        int count=0;
        while (q.getNext()!=null){
     
            q=q.getNext();
            System.out.print("data:"+q.getData()+"    ");
            count++;
            if(count%6==0){
     
                System.out.println();
            }
        }
    }

}

测试类

/**
 * className:Test
 *
 * @author:zjl
 * @version:0.1
 * @date:2020/7/1013:49
 * @since:jdk1.8
 */
public class Test {
     


    public static void main(String[] args) {
     

        //初始化两个链表
        DLinkList dLinkList1 = new DLinkList();
        DLinkList dLinkList2 = new DLinkList();
        //实例化工具类
        DLinkListUtil util = new DLinkListUtil();
        System.out.println("---------------------------------------------------------");
        //头插法建表
        for (int i=0;i<10;i++){
     
            util.HInsert(i,dLinkList1);
        }
        util.show(dLinkList1);
        System.out.println();
        System.out.println("---------------------------------------------------------");
        //尾插法建表
        for (int i=0;i<10;i++){
     
            util.TInsert(i,dLinkList2);
        }
        System.out.println();
        util.show(dLinkList2);
        System.out.println();
        System.out.println("---------------------------------------------------------");
        //查找data为6的节点
        Node node = util.FindElem(6, dLinkList1);
        System.out.println("该节点data:"+node.getData());
        System.out.println("---------------------------------------------------------");
        //在找到的节点node后添加元素"i"
        util.insert("i",node,dLinkList1);
        util.show(dLinkList1);
        System.out.println();
        System.out.println("---------------------------------------------------------");
        //删除找到的节点node
        util.delete(node);
        util.show(dLinkList1);
        System.out.println();
        System.out.println("---------------------------------------------------------");
    }


}

你可能感兴趣的:(java,数据结构,java,链表,数据结构,双向链表)