Version: Next
单向循环链表
定义
- 单向链表
- 最后一个节点的next指向头节点first
与单项链表对比
需要修改:
- 添加方法
- 删除方法
节点toString方法
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("[").append(element).append("]");
if (next == null) {
stringBuilder.append("[null]");
} else {
stringBuilder.append("[").append(next.element).append("]");
}
return stringBuilder.toString();
}
单向循环链表toString方法
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("SingleCycleLinkedList{" + "size=")
.append(size)
.append(" | { ");
if (size == 0) {
stringBuilder.append("null}");
return stringBuilder.toString();
} else {
LinkedListNode<E> node = this.first;
for (int i = 0; i < size - 1; i++) {
stringBuilder.append(node).append(" -> ");
node = node.next;
}
stringBuilder.append(node).append(" }");
}
return stringBuilder.toString();
}
add(int index, E element方法)
在头部插入的情况
- 记录当前first节点的element值
- 用要插入的节点的element值,替换当前first节点的element值
- 建立新节点,值为原先first的值,next为原先first的next
- first的next指向新节点
整个单向循环链表只有一个节点
- 这个节点的next指向自己
// 向index位置插入一个元素
public void add(int index, E element) {
rangeCheckForAdd(index);
LinkedListNode<E> insertNode;
if (index == 0) { // 在头部插入
if (size == 0) { // 空链表,插进去唯一节点,自己指向自己
insertNode = new LinkedListNode<>(element, null);
insertNode.next = insertNode;
first = insertNode;
} else {
E firstElement = first.element; // 记录当前first的值
first.element = element; // 用要插入的节点的element值,替换当前first的element值
// 建立新节点,值为原先first的值,next为原先first的next
insertNode = new LinkedListNode<>(firstElement, first.next);
first.next = insertNode;
}
} else {
LinkedListNode<E> preNode = node(index - 1);
preNode.next = new LinkedListNode<>(element, preNode.next);
}
size++;
}
remove(int index)方法
边界情况,在头部删除
采用移形换位的思想,直接用下一个的值把要删除的节点的值换了
- 把first的next的值复制到first来
- 让first的next指向first.next的next
// 移除index位置的元素并返回
public E remove(int index) {
E removedElement = null;
if (index == 0) { // 头部删除
removedElement = first.element; // 记录被删除的值
first.element = first.next.element; // 把first的next的值复制到first上
first.next = first.next.next; // 让first的next指向first的next的next
} else {
LinkedListNode<E> preNode = node(index - 1);
removedElement = preNode.next.element;
preNode.next = preNode.next.next;
}
size--;
return removedElement;
}