package 集合框架.LinkList;标签:Node,解读,index,代码,元素,next,Linklist,element,null From: https://www.cnblogs.com/Gaze/p/18497707
import org.w3c.dom.Node;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class LinkListTest<E> {
public static class Node<E> {
/**
* @param element存储元素
* @param next下一个元素
* @param prev上一个元素
*/
E element;
Node<E> next;
Node<E> prev;
public Node(E element, Node<E> next, Node<E> prev) {
this.element = element;
this.next = next;
this.prev = prev;
}
}
private Node<E> first;
private Node<E> last;
private Node<E> item;
private int size;
private int modCount;
public boolean add(E e){
LinkLast(e);
return true;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
Node<E> current = first;
while (current != null) {
sb.append(current.element);
if (current.next != null) {
sb.append(", ");
}
current = current.next;
}
sb.append("]");
return sb.toString();
}
public void LinkLast(E e){
final Node<E> l = last;
Node<E> NewNode = new Node<>(e,null,l);
last = NewNode;
//如果是空,说明头节点和尾节点也为空,当前链表就一个元素时候,前后都指引为null
if (l == null){
first = NewNode;
}else{
//如果尾节点不为空,把尾节点指针指向新节点
l.next = NewNode;
}
size++;
}
//删除
public E remove(int index){
//检查索引是否越界
checkElementIndex(index);
//指定删除元素,返回元素节点
return unlink(node(index));
}
Node<E> node(int index) {
//根据索引遍历找到删除元素引用
//如果小于集合一半,从前往后遍历
//如果大于集合一半,从后往前遍历
if(index < (size >> 1)){
Node<E> x = first;
for (int i = 0; i < index; i++){
x = x.next;
}
return x;
}else{
Node<E> x =last;
for (int i = size - 1; i > index; i--){
x = x.prev;
}
return x;
}
}
//断开连接
public E unlink(Node<E> x){
//要删除元素
E item = x.element;
//要删除元素的上一个元素
Node<E> prev = x.prev;
//要删除元素的下一个元素
Node<E> next = x.next;
//判断是否是头节点
if(prev == null){
//如果等于空是头节点,那头节点元素给下个元素
first = next;
}else{
//如果不是头节点,就让上一个元素指向下一个元素
//把要删除元素的下个元素赋值给要删除元素
prev.next = next;
//断开与上个元素的引用
x.prev =null;
}
//判断是否是尾节点
if(next == null){
//把尾部元素给上一个元素
last = prev;
}else{
//不是尾节点,就让下一个元素指向上一个元素
prev.next = next;
x.next = null;
}
//数组元素减去1一
size --;
//返回删除元素
return item;
}
public void checkElementIndex(int index) {
if(index < 0 || index >= size){
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
}
//改
public E set(int index, E element){
//检查索引是否越界
checkElementIndex(index);
//获取要修改元素
Node<E> node = node(index);
//这部分就是要改元素值
E oldValue = node.element;
node.element = element;
return oldValue;
}
//根据索引获取元素
public E get(int index){
Node<E> node = node(index);
return node.element;
}
//根据元素获取索引
public int indexOf(Object e){
int index = 0;
//如果元素等于null,返回null的这个元素的索引
if(e == null){
//不断遍历下一个元素
for (Node<E> x = first; x != null; x = x.next){
//下一个元素等于空返回索引
if (x.element == null){
return index;
}
index++;
}
}else{
for (Node<E> x = first ; x != null; x = x.next){
if (e.equals(x.element)){
return index;
}
index++;
}
}
return -1;
}
//查
public static void main(String[] args) {
LinkListTest<Integer> integerLinkListTest = new LinkListTest<>();
integerLinkListTest.add(1);
integerLinkListTest.add(2);
integerLinkListTest.add(3);
System.out.println(integerLinkListTest.indexOf(1));
}
}