手动实现双向链表

**
 * 双向链表
 * @param <T>
 */
class dlink<T extends Comparable<T>>{//继承Comparable接口用来比较

    /**
     * 创建结点
     * @param <T>
     */
    class Entry<T>{
        T date;
        Entry<T> per;
        Entry<T> next;
        public Entry(T date) {
            this.date = date;
            this.per = null;
            this.next = null;
        }

        public Entry() {
            this.date = null;
            this.per = null;
            this.next = null;
        }
    }
    //设置头结点
    private Entry head ;

    public dlink() {
        this.head = new Entry();
    }

    /**
     * 双向链表的头插
     * @param val
     */
    public void intersHead(T val ){
        Entry<T> entry = new Entry<T>(val);
//        将entry的next指向头结点的下一个节点的next
        entry.next = this.head.next;
//        现在将头结点的next指向entry
        this.head.next = entry;
//        让
        entry.per = this.head;
        if (entry.next != null){
            entry.next.per = entry;
        }
    }

    /**
     * 双向链表的尾插
     * @param val
     */
    public void insertTail(T val){
        Entry<T> entry = new Entry<>(val);
        Entry<T> node  = head;
        while (node.next != null){
            node = node.next;
        }
        node.next = entry;
        entry.per = node;
    }

    /**
     * 双向列表的删除  删除双向链表中值为val的节点
     * @param val
     */
    public void remove(T val){

        Entry<T> cur  = head.next;
        while (cur != null){
//            这里必须用Comparable接口的方法,在底层-128——127之间系统会有自己缓存,比较地址就地址不影响,因为它有缓存
//            用==也可以。但是一超过这个范围就不行了
            if (cur.date.compareTo(val) == 0){
              cur.per.next = cur.next;
              if (cur.next!=null){
                  cur.next.per = cur.per;
              }
            }
            cur = cur.next;
        }
    }

    public void show(){
        Entry<T> tmp = this.head.next;
        while (tmp != null){
            System.out.print(tmp.date+"  ");
            tmp =  tmp.next;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值