数据结构——java实现链表
/**
* @author Lotus_dong
* @create 2020-12-21 9:56
* @function 链表:真正的动态数组
*/
public class MyLinked<T> {
/*创建节点,使用内部类*/
private class Node<T> {
/*节点元素*/
T element;
/*下一个节点*/
Node next;
/**
* 创建节点,添加值,下一个指向next
*
* @param element 节点元素值
*/
public Node(T element) {
this.element = element;
this.next = next;
}
/**
* 默认无参的创建方式,节点为空
*/
public Node() {
this(null);
}
/**
* 创建节点,添加元素,指定下一个节点
*
* @param element 元素
* @param next 下一个节点
*/
public Node(T element, Node next) {
this.element = element;
this.next = next;
}
/**
* 返回节点
*
* @return 返回节点元素
*/
@Override
public String toString() {
return this.element.toString();
}
}
/*链表长度*/
private int size;
/*设置虚拟头节点*/
private Node dummyNode;
/**
* 默认无参的创建虚拟头节点,size=0,虚拟头节点为空
*/
public MyLinked() {
this.size = 0;
this.dummyNode = new Node(null, null);
}
/*对链表的操作*/
/**
* 返回链表的长度
* @return int型,size=链表长度
*/
public int getSize() {
return size;
}
/**
* 判断链表是否为空,若size==0,则为空
* @return true为空,false不为空
*/
public boolean isEmpty() {
return size == 0;
}
/**
* 向链表头部添加元素
* @param element 头部节点
*/
public void addHead(T element) throws IllegalAccessException {
addIndex(element,0);
}
/**
* 向链表中指定位置添加节点
* @param element 节点元素
* @param index 指定索引位置
*/
public void addIndex(T element,int index) throws IllegalAccessException {
Node node = new Node(element);
if (node == null){
throw new IllegalAccessException("node is null!!!");
}
if (index < 0 || index > size) {
throw new IllegalAccessException("Index is error!!!");
}
Node prev = dummyNode;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
//插入操作
node.next = prev.next;
prev.next = node;
size++;
}
/**
* 向链表末尾添加节点
* @param element 节点元素
*/
public void addLast(T element) throws IllegalAccessException {
addIndex(element,size);
}
/**
* 获取头节点元素
* @return 返回头节点元素
*/
public T getHead() {
//返回头结点元素,若为空则返回null,不为空返回element
return dummyNode == null ? null : (T) dummyNode.next.element;
}
/**
* 返回指定索引位置的节点元素
* @param index 指定索引位置
* @return 返回指定索引位置的节点元素
*/
public T getIndex(int index) throws IllegalAccessException {
if (index < 0 || index >= size) {
throw new IllegalAccessException("index is error!!!");
}
Node prev = dummyNode.next;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
return prev == null ? null : (T)prev.element;
}
/**
* 获取最后一个索引位置的节点元素
* @return 返回最后一个索引位置的节点元素
*/
public T getLast() throws IllegalAccessException {
return getIndex(size-1);
}
/**
* 判断链表中是否包含指定元素
* @param element 指定元素
* @return 包含返回true,不包含返回false
*/
public boolean contains(T element) {
boolean flag = false;
Node prev = dummyNode.next;
while (prev != null) {
if (prev.element.equals(element)) {
return true;
}
prev = prev.next;
}
return flag;
}
/**
* 修改指定位置节点元素
* @param index 指定索引位置
* @param element 指定元素
* @return 返回被修改的节点元素
* @throws IllegalAccessException 索引越界,抛出异常
*/
public T setIndex(int index,T element) throws IllegalAccessException {
if (index < 0 || index >= size) {
throw new IllegalAccessException("index is error");
}
Node prev = dummyNode.next;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
T ele = (T)prev.element;
prev.element = element;
return ele;
}
/**
* 删除指定位置节点
* @param index 指定索引位置
* @return 返回被删除的指定索引位置的节点元素
* @throws IllegalAccessException 索引越界,抛出异常
*/
public T remove(int index) throws IllegalAccessException {
if (index < 0 || index >= size) {
throw new IllegalAccessException("index is error");
}
Node prev = dummyNode;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
T ele = (T) prev.next.element;
prev.next = prev.next.next;
size--;
return ele;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
Node prev = dummyNode.next;
while (prev != null) {
sb.append(prev.element+"-->");
prev = prev.next;
}
sb.append("null");
return sb.toString();
}
}