public class SingleCircleLinkedList<E> {
// 节点数量
private int size;
// 头节点
private Node<E> first;
/**
* 在链表尾部添加节点
* @param element
*/
public void add(E element) {
add(size, element);
}
/**
* 在指定索引处,添加节点
* @param index
* @param element
*/
public void add(int index, E element) {
if (index == 0) {
Node<E> newFirst = new Node<>(element, first);
// 拿到最后一个节点
Node<E> last = (size == 0) ? newFirst : node(size - 1);
last.next = newFirst;
first = newFirst;
} else {
Node<E> prev = node(index - 1);
prev.next = new Node<>(element, prev.next);
}
size ++;
}
/**
* 移除指定索引的节点,并返回删除节点的元素值
* @param index
* @return
*/
public E remove(int index) {
Node<E> node = first;
if (index == 0) {
if (size == 1) {
first = null;
} else {
Node<E> last = node(size - 1);
first = first.next;
last.next = first;
}
} else {
Node prev = node(index - 1);
node = prev.next;
prev.next = prev.next.next;
}
size --;
return node.element;
}
/**
* 修改指定索引节点的元素值
* @param index
* @param element
* @return
*/
public E set(int index, E element) {
Node node = node(index);
E oldElement = (E) node.element;
node.element = element;
return oldElement;
}
/**
* 查询指定索引节点的元素值
* @param index
* @return
*/
public E get(int index) {
return node(index).element;
}
/**
* 返回元素值为element的索引值,如果有多个相同的元素值,则返回最近的索引
* @param element
* @return
*/
public int indexOf(E element) {
Node<E> node = first;
if (element == null) {
for (int i = 0; i < size; i ++) {
if (node.element == null) return i;
node = node.next;
}
} else {
for (int i = 0; i < size; i ++) {
if (node.element.equals(element)) return i;
node = node.next;
}
}
return -1;
}
/**
* 清空链表,first置为null之后,剩下的节点会由 JVM GC回收
*/
public void clear() {
size = 0;
first = null;
}
/**
* 返回索引为index的节点
* @param index
* @return
*/
public Node<E> node(int index) {
rangeCheck(index);
Node<E> node = first;
for (int i = 0; i < index; i ++ ) {
node = node.next;
}
return node;
}
/**
* 判断索引的合法性
* @param index
*/
private void rangeCheck(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
}
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
/**
* 打印链表
* @return
*/
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("size = ").append(size).append(", [");
Node<E> node = first;
for (int i = 0; i < size; i ++) {
if (i != 0) {
sb.append(", ");
}
sb.append(node);
node = node.next;
}
sb.append("]");
return sb.toString();
}
/**
* 静态内部类
* @param <E>
*/
private static class Node<E> {
E element;
Node<E> next;
public Node(E element, Node<E> next) {
this.element = element;
this.next = next;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(element).append("_").append(next.element);
return sb.toString();
}
}
}
数据结构之手写单向循环列表(Java)
于 2022-07-21 15:00:57 首次发布