实现类:
package demo03_LinkedList;
import java.util.Iterator;
/**
* @program: dataStructures_algorithms
* @description: 双向环形链表
* @author: Sun
* @create: 2020/01/09 09:15
* @version: 1.0
*/
public class CircleDoubleLinkedList<T> implements Iterable<T> {
private Node first;
private Node last;
private int size;
public CircleDoubleLinkedList() {
first = last = null;
this.size = 0;
}
public CircleDoubleLinkedList(T elem) {
first = last = new Node();
last.item = elem;
first.next = last;
first.previous = last;
last.next = first;
last.previous = first;
size++;
}
/**
* @param elem: 要向链表中添加的元素
* @return void
* @Description: 向链表中添加一个元素
*/
public void add(T elem) {
if (size == 0) {
first = last = new Node();
last.item = elem;
first.next = last;
first.previous = last;
last.next = first;
last.previous = first;
size++;
} else {
Node oldLast = last;
last = new Node();
oldLast.next = last;
last.item = elem;
last.next = first;
last.previous = oldLast;
first.previous = last;
size++;
}
}
/**
* @return T: 返回被删除的元素
* @Description: 删除队列头元素
* @throw RuntimeException
*/
public T poll() {
if (size == 0)
throw new RuntimeException("空链表,无法删除");
T temp = first.item;
if (size == 1) {
first = last = null;
size--;
} else {
first = first.next;
first.previous = last;
last.next = first;
size--;
}
return temp;
}
/**
* @return T: 被删除的元素
* @Description: 删除栈顶元素
* @throw RuntimeException
*/
public T pop() {
if (size == 0)
throw new RuntimeException("空链表,无法删除");
T temp = last.item;
if (size == 1) {
last = first = null;
size--;
} else {
last = last.previous;
last.next = first;
first.previous = last;
size--;
}
return temp;
}
/**
* @param elem: 链表中要删除的元素
* @return T: 返回被删除的元素
* @Description: 删除链表中的指定元素
*/
public T remove(T elem) {
Node current = searchNode(elem);
T temp = current.item;
if (current == first){
poll();
return temp;
}
if (current == last){
pop();
return temp;
}
current.previous.next = current.next;
current.next.previous