链表类:
public class Linked01<E> {
//头结点
private Node<E> first;
//尾结点
private Node<E> last;
//尾插法
public void addLast(E item){
final Node<E> newNode = new Node<E>(item);//新节点
final Node<E> l = last;//保存原尾结点
last = newNode;//尾结点指向新节点
//判断原尾结点是否为null,若原尾结点为null,即新节点既是尾结点也是头节点
if(l == null){
first = newNode;//头节点指向新节点
}else {
l.next = newNode;//原尾结点指向新节点,即指向新的尾结点
}
}
//头插法
public void addFirst(E item){
//新节点
final Node<E> newNode = new Node<E>(item);
//保存原头节点
final Node<E> f = first;
first = newNode;//头节点指向新节点
//判断原头结点是否为null,若原头结点为null,即新节点既是头结点也是尾节点
if(f == null){
last = newNode;//尾结点指向新节点
}else {
newNode.next = f;//新节点的后继指向原头节点
}
}
//重写toString方法,打印链表
public String toString(){
StringJoiner sj = new StringJoiner("->");
for(Node<E> node = first;node != null;node = node.next){
sj.add(node.item.toString());
}
return sj.toString();
}
//节点类
static class Node<E>{
E item;//数据域
Node<E> next;//指针域
public Node(E data){
this.item = data;
}
}
}
测试类:
public class Test01 {
public static void main(String[] args) {
Linked01<String> linked01 = new Linked01<String>();
linked01.addFirst("A");//头插法
linked01.addFirst("B");
linked01.addFirst("C");
linked01.addFirst("D");
System.out.println(linked01.toString());
linked01.addLast("a");//尾插法
linked01.addLast("b");
linked01.addLast("c");
linked01.addLast("d");
System.out.println(linked01.toString());
}
}
运行结果:
总结
头插法:将新节点添加至链表头部。
第一步:创建新节点 newNode ;
第二步:获取原来的头节点 f ;
第三步:将头节点 first 指向新节点 newNode ;
第四步:判断原头节点是否为null:为null即新节点 newNode 既是头节点 first 也是尾结点 last ,则将尾结点 last 指向新节点 newNode ;否则只需将新节点 newNode 的 next 指向原头节点 f 即可。
尾插法:将新节点添加至链表尾部。
第一步:创建新节点 newNode ;
第二步:获取原来的尾结点 l ;
第三步:将尾结点 last 指向新节点 newNode ;
第四步:判断尾头节点是否为null:为null即新节点 newNode 既是尾节点 last 也是头结点 first ,则将头结点 first 指向新节点 newNode ;否则只需将原尾结点 l 的 next 指向新节点 newNode 即可。