**
* 双向链表
* @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;
}
}
}
手动实现双向链表
最新推荐文章于 2024-04-14 23:29:03 发布