package basic;
/**
* 实现LinkedList基本功能
* @author Wayss
* 2017-02-23
*/
public class MyLinkedList implements MyList {
private Node head;
private int size = 0;
public void add(Object o){
Node n = new Node(o);
head.next = n;
size++;
}
public void add(int index , Object o){
//1.index校验
if(index < 0 || index > size){
throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size);
}
//2. 查找index位置的前一个节点
//tempNode为当前链表的第一个节点
Node tempNode = head.next;
for(int i = 0; i < index - 1 ; i++){
tempNode = tempNode.next;
}
Node behindNode = tempNode.next;
Node insertNode = new Node(o);
tempNode.next = insertNode;
insertNode.next = behindNode;
size++;
}
public Object get(int index){
//1.index校验
if(index < 0 || index > size){
throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size);
}
//2. 查找当前节点
Node tempNode = head.next;
for(int i = 0; i < index; i++){
tempNode = tempNode.next;
}
return tempNode.data;
}
public Object remove(int index){
//1.index校验
if(index < 0 || index > size){
throw new IndexOutOfBoundsException("插入的下标越界了:"+"插入的下标为:"+index+"集合大小为:"+size);
}
//2. 查找当前节点的上一个节点
Node tempNode = head.next;
for(int i = 0; i < index - 1; i++){
tempNode = tempNode.next;
}
Node deleteNode = tempNode.next;
Node behideNode = tempNode.next.next;
tempNode.next = behideNode;
size--;
return deleteNode.data;
}
public int size(){
return size;
}
public void addFirst(Object o){
Node insertNode = new Node(o);
insertNode.next = head.next;
head.next = insertNode;
size++;
}
public void addLast(Object o){
Node insertNode = new Node(o);
Node tempNode = head.next;
for(int i = 0; i < size; i++){
tempNode = tempNode.next;
}
tempNode.next = insertNode;
size++;
}
public Object removeFirst(){
Node firstNode = head.next;
head = firstNode.next;
size--;
return firstNode;
}
public Object removeLast(){
Node tempNode = head.next;
//1.移除需要找到最后一个点的前一个点
for(int i = 0; i < size - 1; i++){
tempNode = tempNode.next;
}
Node deleteNode = tempNode.next;
tempNode.next = null;
size--;
return deleteNode;
}
public MyIterator iterator(){
return new MyLinkedListIterator(this);
}
private class MyLinkedListIterator implements MyIterator{
private MyLinkedList list = null;
private int index = 0;
private MyLinkedListIterator(MyLinkedList list){
this.list = list;
}
@Override
public boolean hasNext(){
if(index < size){
return true;
}
return false;
}
@Override
public Object next(){
return list.get(index++);
}
}
private static class Node{
Object data;
Node next;
public Node(Object data){
this.data = data;
}
}
}