链表有多种,在这里我们实现一种简单的单向链表,所谓的链表即是由一个个结点组合起来的;而单向链表中每个结点都有一个成员变量指向链表中的下一个结点(方向是单向的)。
如下图:
每个节点主要有两个成员变量,元素-下一节点地址。实体类对象如下:
public class Node<T> {
public T element;
public Node<T> next;
public Node() {
}
public Node(T element) {
this.element = element;
}
}
该单链比较简单,可以添加成员变量,实现更加丰富的功能。
下方为单链的操作代码:
public class SingleLinkedList<T> {
public Node<T> nodeE;
public Node<T> last;
public int size = 0;
public SingleLinkedList(){
}
public void add(T node) {
Node<T> tNode = new Node<>(node);
if (size <= 0) {
nodeE = tNode;
last = tNode;
size++;
} else {
last.next = tNode;
last = tNode;
size++;
}
}
/**
* @author ZZY33
* @date 2019/12/10 10:08
* @description: 查询对应位子元素 o为首位
*/
public T get(int index) {
if (index < 0 || index > size-1) {
throw new RuntimeException("越界");
}
Node<T> node = nodeE;
for (int i = 0; i <= index-1; i++) {
node = node.next;
}
return node.element;
}
/**
* @date 2019/12/10 10:07
* @description: 移除最后一个
*/
public void removeLast() {
if (size <= 0) {
throw new RuntimeException("越界");
}
if (size == 1) {
nodeE = null;
last = null;
size = 0;
} else {
Node<T> node = nodeE;
for (int i = 1; i < size-1; i++) {
node = node.next;
}
node.next = null;
last = node;
size--;
}
}
/**
* @author ZZY33
* @date 2019/12/10 10:46
* @description:
*/
public void remove(){
if (size <= 0) {
throw new RuntimeException("越界");
}
if (size == 1) {
nodeE = null;
last = null;
size = 0;
} else {
nodeE = nodeE.next;
size--;
}
}
/**
* @author ZZY33
* @param index 需要移除元素位置 从0开始
* @date 2019/12/10 10:52
* @description: 移除指定位置的元素
*/
public void remove(int index) {
if (index < 0 || index > size-1) {
throw new RuntimeException("越界");
}
if (index == 0) {
remove();
} else if(index == size-1){
removeLast();
} else {
Node<T> node = nodeE;
for (int i = 0; i < index-1; i++) {
node = node.next;
}
node.next = node.next.next;
size--;
}
}
}