22-咸鱼学Java-Java中的双向链表

双向链表图示
这里写图片描述
代码

/**
 * 双向链表
 * @author 焦焱
 *
 */
public class DoubleLink {
class Entry{
    int data;
    /**
     * 后继
     */
    Entry next; 
    /**
     * 前驱
     */
    Entry pre;  
    /**
     * 无参构造
     */
    public Entry() {
        this(-1);
    }
    /**
     * 有参数构造
     * @param val
     */
    public Entry(int val) {
        this.data = val;
        this.next = null;
        this.pre = null;
    }
}
/**
 * 头结点
 */
private Entry head = null;
/**
 * 双向链表初始化
 */
public DoubleLink() {
    this.head = new Entry();
}
/**
 * 头插法
 * @param val
 */
public void insertHead(int val)
{   //new一个新节点
    Entry entry = new Entry(val);
    //新节点的后继等于头结点的后继
    entry.next = this.head.next;
    //新节点的前驱等于头结点
    entry.pre = this.head;
    //头结点的后继等于新节点
    this.head.next = entry;
    //如果新节点的next不为空,即就是原头结点有后继
    if(entry.next!=null){
    //则新节点(原头结点)的next,的前驱等于新节点。
    entry.next.pre = entry;
    }
}
/**
 * 尾插法
 * @param val
 */
public void insertTail(int val)
{   //new新节点
    Entry entry = new Entry(val);
    Entry t = this.head;
    //循环到最后一个节点
    while(t.next!=null)
    {
        t = t.next;
    }
    //最后一个节点后继为新节点
    t.next = entry;
    //新节点的前驱为最后一个节点
    entry.pre = t;
}


/**
 * 遍历双向链表
 */
public void show()
{   //和单链表相同
    Entry entry = head.next;
    while(entry!=null)
    {
        System.out.print(entry.data+" ");
        entry = entry.next;
    }
    System.out.println();
}
/**
 * 删除全部的某个元素
 * @param val
 */
public void deleteAllVal(int val)
{   //获得第一个数据域
    Entry entry = this.head.next;
    //循环直到遍历完链表
    while(entry!=null)
    {   //查找到元素以后
        if(entry.data == val)
        {   //当前节点的前驱的后继等于当前节点的后继即可,相当于跳过了此元素
            entry.pre.next = entry.next;
            //如果当前元素不为链表的最后一个元素
            if(entry.next!=null) {
            //当前节点的后一个节点的前驱等于,当前节点的前驱
            entry.next.pre = entry.pre;
            }
        }
        //移位
        entry = entry.next;
    }
}

/**
 * 删除链表中第一个出现的val元素
 * @param val
 */
public void deleteVal(int val)
{
    //获得第一个数据域
        Entry entry = this.head.next;
        //循环直到遍历完链表
        while(entry!=null)
        {   //查找到元素以后
            if(entry.data == val)
            {   //当前节点的前驱的后继等于当前节点的后继即可,相当于跳过了此元素
                entry.pre.next = entry.next;
                //如果当前元素不为链表的最后一个元素
                if(entry.next!=null) {
                //当前节点的后一个节点的前驱等于,当前节点的前驱
                entry.next.pre = entry.pre;
                }
                return;     //删除后直接return
            }
            //移位
            entry = entry.next;
        }
}
}

测试

public static void main(String[] args) {
    DoubleLink t  =  new DoubleLink();
    int doubleLength = 7;
    for (int i = 0; i < doubleLength; i++) {
        t.insertTail(i);
    }
    t.insertHead(5);
    t.insertHead(5);
    t.insertTail(5);
    t.show();
    t.deleteAllVal(5);
    t.show();
}

结果
5 5 0 1 2 3 4 5 6 5
0 1 2 3 4 6
0 2 3 4 6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值