您的位置:首页 > 其它

根据链表的原理,自己实现一个简易版的LinkedList

2017-11-04 04:19 711 查看

前言

接上一篇,本次根据链表的实现原理,自己来尝试写一个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));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: