前言
接上一篇,本次根据链表的实现原理,自己来尝试写一个LinkedList。
MyLinkedList主要包括增、删、改、查几个功能。
代码如下
/**
* 自己实现一个简易版的LinkedList
*
* @author ALion
* @version 2017/11/4 2:22
*/
public class MyLinkedList<E> {
private Node<E> first;
private Node<E> last;
private int size;
public int size() {
return size;
}
/**
* 在末端添加一个element
*/
public void add(E element) {
Node<E> newNode = new Node<>();
if (first == null) {
newNode.pre = null;
newNode.element = element;
newNode.next = null;
first = newNode;
last = newNode;
} else {
newNode.pre = last;
newNode.element = element;
newNode.next = null;
last.next = newNode;
last = newNode;
}
size++;
}
/**
* 获取index位置的Node
*/
private Node<E> node(int index) {
checkIndex(index);
if (index < (size >> 1)) {
Node<E> temp = first;
for (int i = 0; i < index; i++)
temp = temp.next;
return temp;
} else {
Node<E> temp = last;
for (int i = size - 1; i > index; i--)
temp = temp.pre;
return temp;
}
}
/**
* 获取index位置的element
*/
public E get(int index) {
Node<E> node = node(index);
return node == null ? null : node.element;
}
/**
* 移除index位置的element
*/
public void remove(int index) {
Node<E> temp = node(index);
if (first != null && temp != null) {
if (index == 0) {
temp.next.pre = null;
first = temp.next;
} else if (index == size - 1) {
temp.pre.next = null;
last = temp.pre;
} else {
Node left = temp.pre;
Node right = temp.next;
left.next = right;
right.pre = left;
}
size--;
}
}
/**
* 在index处插入一个element
*/
public void add(int index, E element) {
Node node = node(index);
Node newNode = new Node();
newNode.element = element;
if (node != null) {
Node left = node.pre;
Node right = node;
left.next = newNode;
newNode.pre = left;
newNode.next = right;
right.pre = newNode;
size++;
}
}
/**
* 改变index位置的element为新的element
*/
public void set(int index, E element) {
Node node = node(index);
Node newNode = new Node();
newNode.element = element;
if (node != null) {
Node left = node.pre;
Node right = node.next;
left.next = newNode;
newNode.pre = left;
newNode.next = right;
right.pre = newNode;
}
}
/**
* 检查index范围
*/
private void checkIndex(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("index不能<0或者>=size");
}
}
/**
* 链表节点类
*/
private static class Node<E> {
Node<E> pre;
E element;
Node<E> next;
}
}
测试一下
/**
* Main
*
* @author ALion
* @version 2017/11/4 2:34
*/
public class Main {
public static void main(String[] args) {
MyLinkedList<String> list = new MyLinkedList<>();
list.add("你好1");
System.out.println(list.get(0));
list.add("你好2");
list.add("你好3");
list.add("你好4");
list.remove(0);
list.add(2, "nihao");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}