单向循环链表
1.示意图:
2.单向循环链表节点的结构
private static class Entry<T> {
private T value;
private Entry<T> next;
public Entry(T value) {
this.value = value;
this.next = this; //自己指向自己
}
}
3.单向循环链表代码实现
interface:CircleLink
public interface CircleLink<T> {
public abstract boolean addTail(T value);
boolean addHead(T value);
boolean contains(T value);
boolean removehead();
boolean removetail();
boolean removeValue(T value);
int size();
}
SingleCircleLink
public class SingleCircleLink<E extends Comparable<E>> implements CircleLink<E> {
private static class Entry<T> {
private T value;
private Entry<T> next;
public Entry(T value) {
this.value = value;
this.next = this; //自己指向自己
}
}
private Entry<E> headEntry;
private Entry<E> tailEntry;
public void show() {
if(headEntry == null){
return;
}
Entry<E> p = headEntry;
//先不判断先执行一次
do{
System.out.println(p.value);
p = p.next;
}while(p != headEntry);
}
@Override
public boolean addTail(E value) {
Entry<E> newEntry = new Entry<>(value);
if (headEntry == null) {
headEntry = newEntry;
tailEntry = newEntry;
return true;
} else {
tailEntry.next = newEntry;
newEntry.next = headEntry;
tailEntry = newEntry;
return true;
}
}
@Override
public boolean addHead(E value) {
Entry<E> newEntry = new Entry<>(value);
if (headEntry == null) {
headEntry = newEntry;
tailEntry = newEntry;
return true;
} else {
newEntry.next = headEntry;
//更新头结点
headEntry = newEntry;
//尾巴.next
tailEntry.next = newEntry;
return true;
}
}
@Override
public boolean contains(E value) {
//compareTo
Entry<E> p = headEntry;
do{
if(p.value.compareTo(value) == 0){
return true;
}
p = p.next;
}while (p != headEntry);
return false;
}
@Override
public boolean removehead() {
if(headEntry == null){
return false;
}
//判断只有一个结点
if(headEntry == headEntry.next){
headEntry.value = null;
headEntry = null;
tailEntry = null;
return true;
}else{
headEntry.value = null;
headEntry = headEntry.next;
tailEntry.next = headEntry;
return true;
}
}
@Override
public boolean removetail() {
//只有一个结点
if(headEntry == headEntry.next){
headEntry.value = null;
headEntry = null;
tailEntry = null;
return true;
}else{
//首先找到尾巴的前驱
Entry<E> p = headEntry;
for(;p.next != tailEntry;p=p.next){
;
}
tailEntry.value = null;
p.next = headEntry;
tailEntry = p;
return true;
}
}
//查找要删除结点的前驱
public Entry<E> getPrevEntry(E value){
if(headEntry == null){
return null;
}
Entry<E> p = headEntry;
do{
if(p.next.value.compareTo(value) == 0){
return p;
}
p = p.next;
}while(p != headEntry);
return null;
}
@Override
public boolean removeValue(E value) {
if(headEntry == null){
return false;
}
Entry<E> prev = getPrevEntry(value);
if(prev == null){
return false;
}
//如果前驱节点是尾结点,则删除的节点为头结点
if(prev == tailEntry){
removehead();
return true;
} else if(prev.next.next == headEntry){
//如果要删除的节点为为尾巴节点
removetail();
return true;
} else{
prev.next.value = null;
prev.next = prev.next.next;
return true;
}
}
@Override
public int size() {
if(headEntry == null){
return 0;
}
int count = 1;
Entry<E> p = headEntry;
for(;p != tailEntry;p = p.next){
count++;
}
return count;
}
}