package test;
/**
* 自定義一個LinkList
* @author YU
*
*/
public class MyLinkedList <E> {
private Node first;
private Node last;
private int size;
int size() { //返回鏈表長度
return size;
}
boolean isEmpty() { //鏈表是否爲空
return size==0?true:false;
}
public void reset(E obj,int index) { //修改節點的值
checkIndexRange(index);
Node temp = locate(index);
temp.element = obj;
}
public void insert(E obj,int index) { //指定索引處插入節點
checkIndexRange(index);
Node temp = locate(index);
Node newElement = new Node(obj);
temp.previous.next = newElement;
temp.previous = newElement;
newElement.next = temp;
newElement.previous = temp.previous;
size++;
}
public E get(int index) { //獲取指定索引處的節點值
checkIndexRange(index);
Node temp = locate(index);
return (E) temp.element;
}
public void add(E obj) { //增加鏈表節點
Node node = new Node(obj);
size++;
if(first==null) {
first=node;
last=node;
}else {
last.next=node;
node.next=first;
node.previous=last;
first.previous=node;
last=node;
}
}
public void remove(E obj) { //根據值 刪除指定節點
Node temp = first;
int i=0;
while(!temp.element.equals(obj)) {
temp = temp.next;
i++;
}
remove(i);
}
public void remove(int index) { //根據索引 刪除節點
checkIndexRange(index);
Node temp = locate(index);
temp.previous.next = temp.next;
temp.next.previous = temp.previous;
temp = null;
size--;
}
@Override
public String toString() { //重寫toString方法
StringBuilder str = new StringBuilder();
str.append("[");
Node temp = first;
while(temp!=last) {
str.append(temp.element+",");
temp = temp.next;
if(temp==last) {
str.append(temp.element+"]");
}
}
return str.toString();
}
public void checkIndexRange(int index) { //判斷索引是否越界
if(index<0||index>size-1) {
throw new RuntimeException("索引越界:"+index);
}
}
public Node locate(int index) { //定位到指定索引處的節點
Node temp = first;
while(index--!=0) {
temp = temp.next;
}
return temp;
}
public static void main(String[] args) {
MyLinkedList<String> my = new MyLinkedList<String>();
my.add("aa");
my.add("bb");
my.add("cc");
my.add("dd");
my.add("ee");
my.add("ff");
my.add("gg");
my.add("hh");
my.add("ii");
my.reset("99", 4);
System.out.println(my);
System.out.println(my.size());
System.out.println(my.get(3));
System.out.println("####################");
my.remove(3);
System.out.println(my);
System.out.println(my.size());
System.out.println(my.get(3));
System.out.println("####################");
my.remove("99");
System.out.println(my);
System.out.println(my.size());
System.out.println(my.get(3));
}
}
class Node{
Node previous;
Node next;
Object element;
public Node(Node previous, Node next, Object element) {
super();
this.previous = previous;
this.next = next;
this.element = element;
}
public Node(Object element) {
super();
this.element = element;
}
}