package com.wen.imitateArrayListAndLinkedList;
public class MyLinkedList<T> {
/** 根节点 */
private Node root;
/** 尾节点 */
private Node tail;
/** 节点实际长度 */
private Integer size = 0;
/**
* 在链表尾部添加节点值
* @param value
*/
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++;
}
}
/**
* 在链表任意位置添加节点
* @param value
* @param index
*/
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++;
}
}
/**
* 删除节点
* @param value
* @return
*/
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;
}
/**
* 移除首节点
* @return
*/
public boolean removeFirst(){
Node node = root;
if(node!=null){
return remove(node);
}
return false;
}
/**
* 移除尾节点
* @return
*/
public boolean removeLast(){
Node node = tail;
if(node!=null){
return remove(node);
}
return false;
}
/**
* 删除节点的公共方法
* @param node
* @return
*/
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;
}
/**
* 判断索引是否有效
* @param index
* @return
*/
private boolean isValidIndex(int index) {
if(index>=0 && index < size){
return true;
}
throw new IllegalArgumentException("索引越界: "+index);
}
/**
* 判断值是否有效
* @param value
* @return
*/
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;
/**
* 创建节点对象
*
* @param prev
* @param next
* @param value
*/
public Node(Node prev, Node next, T value) {
super();
this.prev = prev;
this.next = next;
this.value = value;
}
}
}
public class MyLinkedList<T> {
/** 根节点 */
private Node root;
/** 尾节点 */
private Node tail;
/** 节点实际长度 */
private Integer size = 0;
/**
* 在链表尾部添加节点值
* @param value
*/
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++;
}
}
/**
* 在链表任意位置添加节点
* @param value
* @param index
*/
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++;
}
}
/**
* 删除节点
* @param value
* @return
*/
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;
}
/**
* 移除首节点
* @return
*/
public boolean removeFirst(){
Node node = root;
if(node!=null){
return remove(node);
}
return false;
}
/**
* 移除尾节点
* @return
*/
public boolean removeLast(){
Node node = tail;
if(node!=null){
return remove(node);
}
return false;
}
/**
* 删除节点的公共方法
* @param node
* @return
*/
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;
}
/**
* 判断索引是否有效
* @param index
* @return
*/
private boolean isValidIndex(int index) {
if(index>=0 && index < size){
return true;
}
throw new IllegalArgumentException("索引越界: "+index);
}
/**
* 判断值是否有效
* @param value
* @return
*/
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;
/**
* 创建节点对象
*
* @param prev
* @param next
* @param value
*/
public Node(Node prev, Node next, T value) {
super();
this.prev = prev;
this.next = next;
this.value = value;
}
}
}