代码:
import java.util.Arrays;
import java.util.LinkedList;
/**
* 自定义的双向链表
* 完成CURD操作
* @author 莱格
*/
public class MyLinkedList {
private Node first;// 头节点
private Node last;// 尾节点
private int size;// 容器大小
/**
* 添加元素
*/
public void add(Object obj) {
Node n = new Node();
if (first == null) {
n.setPrevious(null);// 将上一节点的保存上一节点信息的节点置为空
n.setObj(obj);
n.setNext(null);// 设置下一节点的信息为null
first = n;// 此时头节点尾结点都是它本身
last = n;// 此时头节点尾结点都是它本身
} else {
n.setPrevious(last);// previous将保存上一节点的信息
n.setObj(obj);// 往对象中添加数据信息
n.setNext(null);// 设置尾节点的信息为空,此时无上一节点
last.setNext(n);// 节点信息保存作为尾结点
last = n;
}
size++;
}
/**
* 返回节点的长度
*/
public int size() {
return size;
}
/**
* 删除元素 思路: 删除指定索引的节点 将头节点的next指向尾节点 将尾节点的previous指向头节点
* LinkedList
*/
// LinkedList<E>
public void remove(int index) {
Node temp = node(index);
if (temp != null) {
if (index == 0) {
}
Node up = temp.previous;// 获取temp的上一节点
Node down = temp.next;// 获取当前节点的下一节点
up.next = down;
down.previous = up;
}
size--;
}
/**
* 在头节点添加一个元素
* */
public void addFirst(Object obj) {
//Node temp = node(0);
Node node = new Node();
node.setObj(obj);
node.next = first;
first.previous = node;
node.previous = null;
first = node;
size++;
}
/**
* 在尾节点添加一个元素
* */
public void addLast(Object obj) {
Node node = new Node();
node.setObj(obj);
node.previous = last;
last.next = node;
node = last;
size++;
}
/**
* 删除头节点
* */
public void removeFirst() {
Node second = first.next;
second.previous = null;
first = second;
size--;
}
/**
* 删除尾结点
* */
public void removeLast() {
Node nxt = last.previous;
nxt.next = null;
last.previous = null;//help gc
last = nxt;
size--;
}
/**
* 在i节点处添加n节点
*
* */
public void add(int index, Object obj) {
checkIndex(index);
Node temp = node(index);
Node node = new Node();
node.setObj(obj);
if (temp != null) {
Node nxt = temp.next;
node.previous = temp;
temp.next = node;
nxt.previous = node;
node.next = nxt;
}
size++;
}
/**
* 获取index索引处的值
* */
public Object get(int index) {
checkIndex(index);
Node temp = null;
if (first != null) {
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
}
return temp.getObj();
}
/**
* 修改index处对应节点的信息
* */
public void update(int index,Object obj) {
checkIndex(index);
Node temp = node(index);
if (temp != null) {
temp.setObj(obj);
}
}
/**
* 索引检查
*/
public void checkIndex(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("索引越界了");
}
}
/**
* 返回指定索引的节点
* LinkedList
* @param index
* @return
*/
public Node node(int index) {
checkIndex(index);
Node temp = null;
if (first != null) {
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
}
return temp;
}
/**
* 将链表转换成数组
* */
public Object[] toArray() {
Object[] obj = new Object[size];
for (int i = 0; i < size; i++) {
obj[i] = get(i);
}
return obj;
}
/**
* 将链表转换成字符数组输出
* */
public String toString() {
return Arrays.toString(toArray()).replaceAll(" ", "");
}
/**
* 测试方法
* @param args
*/
public static void main(String[] args) {
MyLinkedList m = new MyLinkedList();
m.add("aaa");
m.add("bbb");
m.add("ccc");
m.add("ddd");
m.add("eee");
m.add("fff");
m.add(123);
m.removeLast();
System.out.println(m.size());
System.out.println(m.get(5));
System.out.println(m.toString());
}
}
节点信息:
/**
* 节点信息
*@author 莱格
*/
public class Node {
/**
* 保存上一个节点的信息
* */
Node previous;
/**
* 保存本节点的信息
* */
private Object obj;
/**
* 保存下一个节点 的信息
* */
Node next;
public Node() {
super();
}
public Node(Node previous, Object obj, Node next) {
super();
this.previous = previous;
this.obj = obj;
this.next = next;
}
public Node getPrevious() {
return previous;
}
public void setPrevious(Node previous) {
this.previous = previous;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}