本篇的目的主要是自己去实现双向链表以能够更好的理解LinkedList。
首先定义一个Node类
package com.wonglar.linkedlist;
public class Node {
//前一个结点
private Node previous;
//结点中的对象
private Object obj;
//后一个结点
private Node next;
public Node() {
}
public Node(Node previous, Object obj, Node next) {
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;
}
}
具体实现
package com.wonglar.linkedlist;
public class ImplLinkedList {
// 第一个结点
private Node first;
// 最后一个结点
private Node last;
// 链表中元素个数
private int size;
/**
* 向链表中添加元素
*
* @param obj
* :待添加的元素
*/
public void add(Object obj) {
Node n = new Node();
if (first == null) {
n.setPrevious(null);
n.setObj(obj);
n.setNext(null);
// 当链表中一个元素都没有的时候
// 添加一个元素,这个元素即是第一个元素,又是最后一个元素
first = n;
last = n;
} else {
// 当链表中有元素了,即往last后面添加
n.setPrevious(last);
n.setObj(obj);
n.setNext(null);
// 此时last已不是最后一个元素
last.setNext(n);
// 将新添加的元素置为last
last = n;
}
size++;
}
/**
* 通过索引得到元素
*
* @param index
* :待得到元素的索引
* @return
*/
public Object get(int index) {
rangeCheck(index);
Node temp = first;
for (int i = 0; i < index; i++) {
temp = temp.getNext();
}
return temp.getObj();
}
/**
* 根据索引,修改元素的值
*
* @param index
* :待修改元素索引
* @param element
* :修改后的元素的值
*/
public void set(int index, Object element) {
rangeCheck(index);
Node temp = first;
for (int i = 0; i < index; i++) {
temp = temp.getNext();
}
temp.setObj(element);
}
/**
* 根据索引删除链表中的元素
*
* @param index
* :待删除元素的索引
* @return :删除掉的元素值
*/
public Object remove(int index) {
rangeCheck(index);
Node temp = this.first;
Node last = this.last;
// 如果删除第一个元素,需要将第一个元素的指向后一个结点的值设为null
// 将它的下一个元素的指向头一个结点的值设为null,然后将第二个元素赋于first
if (index == 0) {
Node down = temp.getNext();
down.setPrevious(null);
first.setNext(null);
first = down;
} else if (index == size - 1) {
temp = last;
Node up = last.getPrevious();
last.setPrevious(null);
up.setNext(null);
this.last = up;
} else {
for (int i = 0; i < index; i++) {
temp = temp.getNext();
}
Node up = temp.getPrevious();
Node down = temp.getNext();
up.setNext(down);
down.setPrevious(up);
}
size--;
return temp.getObj();
}
/**
* 根据元素值删除链表中的元素
* @param o :待删除的元素
* @return :是否删除成功
*/
public boolean remove(Object o){
Node temp = this.first;
if(o==null){
for (int index = 0; index < this.size; index++) {
if(temp.getObj()==null){
//执行删除操作
remove(index);
return true;
}
temp = temp.getNext();
}
}else{
for (int index = 0; index < this.size; index++) {
if(temp.getObj().equals(o)){
remove(index);
return true;
}
temp = temp.getNext();
}
}
return false;
}
/**
* 检查索引是否越界
*
* @param index
*/
private void rangeCheck(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("索引越界异常:index:" + index + ",size:" + size);
}
}
/**
* 返回链表中元素个数
*
* @return
*/
public int size() {
return size;
}
}