package com.github.qq809203042.coding2017.basic.structures;
/*
* 根据API实现自己的LinkedList数据结构
*/
public class MyLinkedList implements MyList {
// 头节点对象,不存储元素,用于指示链表的起始位置
private Node head = new Node(null,null);
// 尾节点对象
private Node last = new Node(null,null);
// 链表长度
int size = 0;
@Override
public Object get(int index) {
Node node = node(index);
return node.data;
}
@Override
public boolean add(Object obj) {
addLast(obj);
return true;
}
@Override
public boolean add(Object obj, int index) {
if(index < 0 || index > size){
throw new IndexOutOfBoundsException("下标越界");
}
if(index == size){//等同于添加到末尾
addLast(obj);
return true;
}
Node nodeIndex = node(index);//获取index处的节点
Node newNode = new Node(obj,nodeIndex);//新增元素的next指向原来index处
if(index == 0){
head.next = newNode;
}else{
Node nodeBeforeIndex = node(index-1);
nodeBeforeIndex.next = newNode;
}
size++;
return true;
}
@Override
public Object remove(int index) {
if(index < 0 || index >= size){
throw new IndexOutOfBoundsException("下标越界");
}
if(index == 0){
return removeFirst();
}else{
Node nodeIndex = node(index);
Object removeData = nodeIndex.data;
node(index-1).next = nodeIndex.next;
size--;
return removeData;
}
}
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
public void addFirst(Object obj) {
// 创建一个临时节点存储第一个节点
Node tempFirst = head.next;
// 创建所需添加元素的节点对象
Node newNode = new Node(obj, tempFirst);
head.next = newNode;
if (tempFirst == null) {// 如果链表中没有元素,则将添加的节点同时赋值为尾节点
last = newNode;
}
size++;
}
public void addLast(Object obj) {
// 创建一个临时节点存储尾节点
Node tempLast = last;
// 创建所需添加元素的节点对象
Node newNode = new Node(obj, null);
last = newNode;
if (size == 0) {// 如果链表中没有元素,则将添加的节点同时赋值为头节点
head.next = newNode;
} else {// 如果链表中原先存在元素,则将原来尾节点的next指向现在的节点
tempLast.next = newNode;
}
size++;
}
public Object removeFirst() {
if(size == 0){
throw new NullPointerException("链表为空");
}
Node removeNode =head.next;
Object removeData = removeNode.data;
head.next = removeNode.next;
size--;
return removeData;
}
public Object removeLast() {
if(size <= 1){
return removeFirst();
}else{
Object removeData = last.data;
last = node(size-2);
last.next = null;
size--;
return removeData;
}
}
@Override
public String toString() {
if(size == 0){
return "[]";
}
StringBuffer listToString = new StringBuffer();
listToString.append("[");
Node node = head;
for(int i = 0; i < size;i++){
node = node.next;
listToString.append(node.data);
if(i<size-1){
listToString.append(",");
}
}
listToString.append("]");
return listToString.toString();
}
// 节点内部类
private static class Node {
Object data;
Node next;
// 构造函数
Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
// 找到下标为index的节点并返回
private Node node(int index) {
if(size == 0){
throw new IndexOutOfBoundsException("链表为空");
}else if(index < 0 || index >= size){
throw new IndexOutOfBoundsException("下标越界");
}
Node node = head.next;
for(int i = 1; i <= index; i++){
node = node.next;
}
return node;
}
}