双向链表图示

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