package com.coding.basic;
public class LinkedList implements List, Iterator{
private Node head;
private Node tail;
private Node currentNode;
private int size;
public LinkedList(){
this.head = new Node(null);
this.tail = head;
this.currentNode = head;
this.size = 0;
}
@Override
public void add(Object o) {
Node node = new Node(o, null);
tail.setNext(node);
tail = node;
size++;
}
@Override
public void add(int index, Object o) {
if(index < 0 || index > size+1){
throw new RuntimeException("插入的位置错误...");
}
Node pre = head; // 得到待插入位置的前一个节点
for(int i=0; i<index; i++){
pre = pre.getNext();
}
Node behind = pre.getNext(); // 得到待插入位置的节点
Node node = new Node(o, behind); // 构造当前节点并使当前节点的next指向behind
pre.setNext(node);
size++;
}
@Override
public Object get(int index) {
if(index < 0 || index >= size){
throw new RuntimeException("index参数错误...");
}
Node node = head; // 得到待插入位置的前一个节点
for(int i=0; i<=index; i++){
node = node.getNext();
}
return node;
}
@Override
public Object remove(int index) {
if(index < 0 || index >= size){
throw new RuntimeException("index参数错误...");
}
Node pre = head; // 得到待删除位置的前一个节点
for(int i=0; i<index; i++){
pre = pre.getNext();
}
Node node = pre.getNext(); // 得到待删除位置的节点并返回
Node behind = node.getNext(); // 得到待删除位置的后一个节点
pre.setNext(behind);
size--;
return node;
}
@Override
public int size() {
return size;
}
// 按顺序打印节点值
public void printData(){
Node node = head.getNext();
while(node != null){
System.out.println(node.getData());
node = node.getNext();
}
}
@Override
public boolean hasNext() {
if(currentNode == tail){
return false;
}else{
currentNode = currentNode.getNext();
return true;
}
}
@Override
public Object next() {
return currentNode;
}
}