import java.util.Iterator;
public class TowWayLinkList<T> implements Iterable<T> {
//首结点
private Node head;
//尾结点
private Node tail;
//链表的长度
private int N;
public TowWayLinkList() {
tail = null;
head = new Node(null, null, null);
N = 0;
}
// 清空链表
public void clear() {
tail = null;
head.next = tail;
head.pre = null;
head.item = null;
N = 0;
}
//获取链表长度
public int length() {
return N;
}
//判断链表是否为空
public boolean isEmpty() {
return N == 0;
}
// 插入元素t
public void add(T t) {
if (tail == null) {
Node node = new Node(t, head, null);
head.next = node;
tail = node;
} else {
Node node = new Node(t, tail, null);
tail.next = node;
tail = node;
}
N++;
}
// 向指定位置i处插入元素t
public void add(int i, T t) {
if (i < 0 || i >= N) {
throw new RuntimeException("位置不合法");
}
Node pre = head;
//pre 为i的前一个结点
for (int index = 0; index < i; index++) {
pre = pre.next;
}
Node node = new Node(t, pre, pre.next);
pre.next.pre = node;
pre.next = node;
N++;
}
// 获取指定位置i处的元素
public T get(int i) {
if (i < 0 || i > N) {
throw new RuntimeException("位置不合法");
}
Node pre = head.next;
//pre 为i结点
for (int index = 0; index < i; index++) {
pre = pre.next;
}
return pre.item;
}
//找到元素t在链表中第一次出现的位置
public int indexOf(T t) {
Node n = head.next;
for (int index = 0; n != null; index++) {
if (n.item.equals(t)) {
return index;
}
}
return -1;
}
//删除位置i处的元素,并返回该元素
public T remove(int i) {
if (i < 0 || i >= N) {
throw new RuntimeException("位置不合法");
}
Node pre = head;
//pre 为i的前一个结点
for (int index = 0; index < i ; index++) {
pre = pre.next;
}
// n为 i结点
Node n = pre.next;
// tail 为i的后一个结点
Node tail = pre.next.next;
tail.pre = pre;
pre.next = tail;
N--;
return n.item;
}
// 获取第一个元素
public T getFirst() {
if (isEmpty()) {
return null;
}
return head.next.item;
}
// 获取最后一个元素
public T getLast() {
if (isEmpty()) {
return null;
}
return tail.item;
}
// 结点类
private class Node {
// 存储数据
public T item;
// 指向上一个结点
public Node pre;
// 指向下一个结点
public Node next;
public Node(T item, Node pre, Node next) {
this.item = item;
this.pre = pre;
this.next = next;
}
}
@Override
public Iterator<T> iterator() {
return new TIterator();
}
private class TIterator implements Iterator {
private Node n = head;
@Override
public boolean hasNext() {
return n.next != null;
}
@Override
public Object next() {
n = n.next;
return n.item;
}
}
public static void main(String[] args) {
TowWayLinkList<String> list = new TowWayLinkList<>();
list.add("乔峰");
list.add("虚竹");
list.add("段誉");
list.add(1,"鸠摩智");
list.add(3,"叶二娘");
for (String str : list) {
System.out.println(str);
}
System.out.println("----------------------");
String tow = list.get(2);
System.out.println(tow);
System.out.println("-------------------------");
String remove = list.remove(3);
System.out.println(remove);
System.out.println(list.length());
System.out.println("--------------------");
System.out.println(list.getFirst());
System.out.println(list.getLast());
}
}