package headlink;
import org.junit.Test;
/**
* 带头节点的单链表的实现
* @param <T>
*/
class Link<T extends Comparable<T>>{
// 指向单链表的第一个节点
HeadEntry<T> head;
public Link(){
this.head = new HeadEntry<>(0, null, null);
}
/**
* 单链表的头插法
* @param val
*/
public void insertHead(T val){
Entry<T> node = new Entry<>(val, this.head.next);
this.head.next = node;
this.head.cnt += 1; // 更新头节点中链表节点的个数
}
/**
* 单链表的尾插法
* @param val
*/
public void insertTail(T val){
Entry<T> node = head;
while(node.next != null){
node = node.next;
}
node.next = new Entry<>(val, null);
this.head.cnt += 1; // 更新头节点中链表节点的个数
}
/**
* 单链表中删除值尾val的节点
* @param val
*/
public void remove(T val){
Entry<T> pre = head;
Entry<T> cur = head.next;
while(cur != null){
if(cur.data == val){
// val节点的删除
pre.next = cur.next;
this.head.cnt -= 1; // 更新头节点中链表节点的个数
//break; 只删除第一个值尾val的节点
cur = pre.next; // 删除链表中所有值为val的节点
} else {
pre = cur;
cur = cur.next;
}
}
}
/**
* 打印单链表的所有元素的值
*/
public void show(){
Entry<T> temp = this.head.next;
while (temp!=null) {
System.out.print(temp.data + " ");
temp=temp.next;
}
System.out.println();
}
public int getNodeCount() {
return this.head.cnt;
}
/**
* 单链表的节点类型
* @param <T>
*/
static class Entry<T>{
T data; // 链表节点的数据域
Entry<T> next; // 下一个节点的引用
public Entry(T data, Entry<T> next) {
this.data = data;
this.next = next;
}
}
/**
* 头节点的类型
* @param <T>
*/
static class HeadEntry<T> extends Entry<T>{
int cnt; // 用来记录节点的个数
public HeadEntry(int cnt, T data, Entry<T> next) {
super(data, next);
this.cnt = cnt;
}
}