package com.coding.basic;
/**
* @Description 简单实现linkedList
*/
public class SimpleLinkedList implements SimpleList{
private Node head;
private int size = 0;
/**
* 返回集合长度
* @return 长度
*/
public int size(){
return this.size;
}
/**
* 返回指定索引出元素
* @param index 索引
* @return Object 元素
*/
public Object get(int index){
rangeCheck(index);
Node current = head;
for(int i =0;i<index;i++){
current = current.next;
}
return current.o;
}
/**
* 插入元素o,默认是往头部插入
* @param o 待插入元素
*/
public void add(Object o){
addFirst(o);
}
/**
* 在指定索引处插入元素
* @param index 索引
* @param o 待插入元素
*/
public void add(int index,Object o){
rangeCheck(index);
if(index == 0){
addFirst(0);
return;
}
if(index == size){
addLast(o);
return;
}
Node newNode = new Node(o);
Node current = head;
for(int i = 0;i < index -1;i++){
current = current.next;
}
newNode.next = current.next;
current.next = newNode;
size ++;
}
/**
* 索引越界处理
* @param index 索引
*/
private void rangeCheck(int index) {
if(index > size || index < 0){
throw new RuntimeException("找不到该节点");
}
}
//头插法
public void addFirst(Object o){
Node newNode = new Node(o);
newNode.next = head;
head = newNode;
size++;
}
//尾插法
public void addLast(Object o){
Node newNode = new Node(o);
Node current = head;//设定一个当前节点,便于遍历
while(current.next!=null){
current = current.next;
}
if(current.next == null)//尾节点
{
current.next = newNode;
size++;
}
}
/**
* 移除该索引处元素
* @param index 索引位置
* @return 移除元素
*/
public Object remove(int index){
rangeCheck(index+1);
Node current = head;
if(index == 0){//头部删除
Object removeObj = head.o;
head = head.next;
size --;
return removeObj;
}
int i;
for(i=0;i<index-1;i++){
current = current.next;
}
Object removeObject = get(i);
if(index == size-1){//尾部删除
current.next = null;
size--;
return removeObject;
}
current.next = current.next.next;
size--;
return removeObject;
}
//内部类,声明为static 与实例无关
private static class Node{
private Object o;//单链表的数据域
private Node next;//单链表的指针域
private Node(Object o){
this.o = o;
}
}
}