package com.wen.imitateArrayListAndLinkedList;
public class MyLinkedList<T> {
private Node root;
private Node tail;
private Integer size = 0;
public void add(T value){
if(isValidValue(value)){
Node newNode = new Node(tail, null, value);
//如果連結清單沒有節點
if(root==null){
root = newNode;
}else{
//連結清單有節點,将新節點當成尾節點
tail.next = newNode;
}
tail = newNode;
size++;
}
}
public void insertAt(T value,int index){
if(isValidValue(value) && isValidIndex(index)){
//拿到目标節點
Node node = root;
for (int i = 0; i < index; i++) {
node = node.next;
}
//建立新節點
Node newNode = new Node(node.prev, node, value);
//插入節點
//1.如果是插入到首節點
if(node==root){
root = newNode;
}else{
//2.插入到中間節點
node.prev.next = newNode;
}
size++;
}
}
public boolean removeNode(T value){
if(isValidValue(value)){
Node node = root;
for (int i = 0; i < size; i++) {
T val = node.value;
if(val.equals(value)){
return remove(node);
}
node = node.next;
}
}
return false;
}
public boolean removeFirst(){
Node node = root;
if(node!=null){
return remove(node);
}
return false;
}
public boolean removeLast(){
Node node = tail;
if(node!=null){
return remove(node);
}
return false;
}
private boolean remove(Node node) {
//移除首節點
if(node.prev==null){
root = node.next;
}else if(node.next==null){
//移除尾節點
tail = node.prev;
}else{
//移除中間節點
node.prev.next = node.next;
}
node = null;
size--;
return true;
}
private boolean isValidIndex(int index) {
if(index>=0 && index < size){
return true;
}
throw new IllegalArgumentException("索引越界: "+index);
}
private boolean isValidValue(T value) {
if(value!=null){
return true;
}
throw new IllegalArgumentException("值不能 為null: "+value);
}
public void print() {
StringBuilder sb = new StringBuilder(2 * size + 1);
sb.append("{");
if(size>0){
Node node = root;
for (int i = 0; i < size; i++) {
sb.append(node.value);
if(i!=size-1){
sb.append(",");
}
node = node.next;
}
}
sb.append("}");
System.out.println(sb.toString());
}
// 建立節點類
private class Node {
Node prev;
Node next;
T value;
public Node(Node prev, Node next, T value) {
super();
this.prev = prev;
this.next = next;
this.value = value;
}
}
}