/**
* 节点类
* @author JP
*
*/
class Node {
Object value;//节点元素值
Node pre;//上一个节点
Node next;//下一个节点
public Node(Object value) {
this.value = value;
}
}
/**
* 链表类
* @author JP
*
*/
public class MyLinkedList {
Node cur;//目前指向的节点
Node head;//头结点
Node end;//尾节点
int size = 0;
/**
* 实例化头节点和尾节点
*/
public MyLinkedList() {
head = new Node("head");
end = new Node("end");
//设置头尾相连
head.next = end;
end.pre = head;
}
/**
* 增加操作
* @param value
*/
public void add(Object value) {
//判断当前插入的元素是否是第一个元素
if (cur == null) {
cur = new Node(value);
head.next = cur;
cur.pre = head;
} else {
Node node = new Node(value);
cur.next = node;
node.pre = cur;
cur = node;//将cur元素设置为当前插入的节点
}
cur.next = end;
end.pre = cur;
size++;
}
/**
* 在指定位置插入元素,第一个元素的下标为0
* @param index
* @param value
* @throws Exception
*/
public void add(int index, Object value) throws Exception {
//判断当前要插入的元素是否为链表的最后一个元素
if (index == size) {
this.add(value);
} else {
Node tmp = this.get(index);//当前index位置所对应的节点
Node node = new Node(value);//当前要插入的节点
tmp.pre.next = node;
node.pre = tmp.pre;
node.next = tmp;
tmp.pre = node;
}
size++;
}
/**
* 删除指定位置的元素,第一个元素的下标为0
* @param index
* @throws Exception
*/
public void remove(int index) throws Exception {
Node tmp = this.get(index);//当前index位置所对应的节点
tmp.pre.next = tmp.next;
tmp.next.pre = tmp.pre;
size--;
}
/**
* 获取指定位置的节点元素
* @param index
* @return
* @throws Exception
*/
public Node get(int index) throws Exception {
if (index < 0 || index >= size) {
throw new Exception("数组下标越界!");
}
Node node = head.next;
for (int i = 1; i <= index; i++) {
node = node.next;//迭代为下一个节点
}
return node;
}
/**
* 将链表转化成数组
* @return
*/
public Object[] toArray() {
Object[] arr = new Object[size];
Node node = head.next;
for (int i = 0; i < arr.length; i++) {
arr[i] = node.value;
node = node.next;//迭代为下一个节点
}
return arr;
}
public static void main(String[] args) throws Exception {
MyLinkedList list = new MyLinkedList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
//list.remove(4);
//list.add(4,"a");
Object[] arr = list.toArray();
for (Object obj : arr) {
System.out.println(obj);
}
}
}