package com.coding.datastructs;
public class LinkedList implements List{
private Node head;
private int size ;
public LinkedList() {
size = 0;
head=new Node();
}
public void add(Object o) {
Node pnew = new Node();
pnew.setData(o);
pnew.next = null;
if(null==head.getNext()){
head.setNext(pnew);
return;
}
Node ptr = head.getNext();
Node ptr1 = new Node();
while (ptr != null) {
ptr1 = ptr;
ptr = ptr.getNext();
}
ptr1.next = pnew;
}
public void add(int index, Object o) {
size();
if (index > size || index < 0)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
Node ptr;
Node ptemp = new Node();
;
Node pnew;// ʵ�����½ڵ�
ptr = head.getNext();
int i = 0;
if (ptr == null && size == 0) {
System.out.println("��������ʧ�ܣ�");
}
while (ptr != null) {
ptemp = ptr;
if (index == 0) {
pnew = new Node();
pnew.setData(o);
pnew.setNext(ptr);
head.setNext(pnew);
break;
}
if (index == i && index > 0) {
ptemp = getNode(i-1);
pnew = new Node();
pnew.setData(o);
pnew.setNext(ptr);
ptemp.setNext(pnew);//
System.out.println("��������" + o + "�ɹ���");
break;
}
ptr = ptr.getNext();
i++;
}
if (ptr == null && size > 0) {
pnew = new Node();
pnew.setData(o);
pnew.setNext(null);
ptemp.setNext(pnew);//
System.out.println("��������" + o + "�ɹ���");
}
}
public Object get(int index) {
size();
if (index > size || index < 0 || index == size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
Node ptr = head.getNext();
Object tempData = null;
int i = 0;
while (ptr != null) {
if (index == i) {
tempData = ptr.getData();
}
ptr = ptr.getNext();
i++;
}
return tempData;
}
public Node getNode(int index) {
size();
if (index > size || index < 0 || index == size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
Node ptr = head.getNext();
Node tempData = null;
int i = 0;
while (ptr != null) {
if (index == i) {
tempData = ptr;
}
ptr = ptr.getNext();
i++;
}
return tempData;
}
public Object remove(int index) {
size();
if(size()==0){
throw new NullPointerException("list�ڲ�Ϊ�գ�����ɾ������");
}
if (index > size || index < 0 || index == size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
Node ptr = head.getNext();
Node ptrNext = new Node();
Object tempData = null;
int i = 0;
while (ptr != null) {
if (index == 0) {
ptrNext = ptr.getNext();
head.setNext(ptrNext);
break;
}
if (index == i && index > 0) {
Node ptrprevious = getNode(i - 1);
tempData = ptr.getData();
ptrprevious.setNext(ptr.getNext());
break;
}
ptr = ptr.getNext();
i++;
}
return tempData;
}
public int size() {
int i = 0;
Node ptr = head.getNext();
while (ptr != null) {
ptr = ptr.getNext();
i++;
}
size = i;
return size;
}
public void addFirst(Object o) {
add(0,o);
}
public void addLast(Object o) {
/*Node ptr = head.getNext();
Node pnew = new Node();
pnew.setData(o);
Node ptemp = new Node();
if (ptr == null) {
head.setNext(pnew);
} else {
while (ptr != null) {
ptemp = ptr;
ptr = ptr.getNext();
}
if (ptr == null) {
ptemp.setNext(pnew);
}
}*/
add(size(),o);
}
public Object removeFirst() {
Node ptr = head.getNext();
Object temp = null;
if (ptr == null) {
throw new NullPointerException("LinkedList���������ݣ����ܽ���ɾ������");
} else {
temp = ptr.getData();
remove(0);
}
return temp;
}
public Object removeLast() {
size();
Node ptr = head.getNext();
Object temp = null;
if (ptr == null) {
throw new NullPointerException("LinkedList���������ݣ����ܽ���ɾ������");
} else {
temp = remove(size - 1);
}
return temp;
}
private static class Node {
Object data;
Node next;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
}