双链表基本操作的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("---------------------------------------------------------");
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值