双链表的头插法和尾插法——
头插图
尾插图
头插和尾插同时使用时,需要把头插产生的链表和尾插产生的链表连接起来。上面两个图片可以说明,有两个节点是无论如何都保持不变的。它们分别是 头插入法创建的第一个节点,和尾插法的头节点。当头插法的第一个节点的指针指向尾插法的头节点,此时的单链表既可以使用头插法,也可以使用尾插法。
实现类
package best;
public class SingleLinked<V> {
Node<V> first;
Node<V> last;
Node<V> appendFirst;
int size;
public static class Node<V>{
V value;
Node<V> next;
public Node(V value) {
super();
this.value = value;
}
public Node(V value,Node<V> next) {
super();
this.value = value;
this.next = next;
}
}
public void forEach() {
for (Node<V> node = first; node != null; node = node.next) {
System.out.println(node.value);
}
}
public boolean beforeAdd(V val){
if( first==null ){
first = new Node<V>(val);
appendFirst = first;
return true;
}
Node<V> newNode = new Node<>(val,first);
first = newNode;
size++;
return true;
}
public boolean afterAdd(V val) {
if( first==null ){
return beforeAdd(val);
}
if ( last==null ){
Node<V> newNode = new Node<V>(val,null);
last = newNode;
appendFirst.next = last;
return true;
}
if( last.next==null ){
Node<V> newNode= new Node<V>(val,null);
last.next = newNode;
last = newNode;
}
size++;
return true;
}
public V get(int index) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("下标越界");
if (index == 0) {
return first.value;
}
Node<V> node = first;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node.value;
}
}
测试类
package best;
public class TestLinked {
public static void main(String[] args) {
testBeforeAndLastAdd();
}
public static void testBeforeAdd(){
SingleLinked<String> myLinkedList = new SingleLinked<>();
myLinkedList.beforeAdd("张飞");
myLinkedList.beforeAdd("关羽");
myLinkedList.beforeAdd("刘备");
myLinkedList.forEach();
}
public static void testAfterAdd(){
SingleLinked<String> myLinkedList = new SingleLinked<>();
myLinkedList.afterAdd("刘备");
myLinkedList.afterAdd("关羽");
myLinkedList.afterAdd("张飞");
myLinkedList.forEach();
System.out.println("-------------以下为get方法测试---------------");
System.out.println("第2个用户的名字为"+myLinkedList.get(1));
}
public static void testBeforeAndLastAdd(){
SingleLinked<String> myLinkedList = new SingleLinked<>();
myLinkedList.afterAdd("关羽");
myLinkedList.afterAdd("张飞");
myLinkedList.beforeAdd("刘备");
myLinkedList.forEach();
}
}