/** * Created by peter on 2017/2/22. */ public class LinkedList { private Node head,tail; private int size=0; public void add(Object o){ Node node = new Node(); node.data = o; node.next=null; if(size==0){ head=node; tail=node; }else{ tail.next = node; tail = tail.next; } size++; } public void add(int index,Object o){ if(index<0||index>size){ System.out.println("插入下标越界"); throw new ArrayIndexOutOfBoundsException(); } //如果插入的位置是第一个 if(index==0){ Node node =new Node(); node.data = o; node.next = head; head = node; }else { int i =0;//记录走过的节点 Node p = head;//移动节点 while (i<index-1){ p=p.next; i++; } //寻找到要插入位置的上一个位置 Node node = new Node(); node.data=o; node.next=p.next; p.next=node; } size++; } public Object get(int index){ if(index<0||index>size-1){ System.out.println("访问下标越界"); throw new ArrayIndexOutOfBoundsException(); } Node node =head; int i=0; while (i<index){ node=node.next; i++; } return node.data; } public Object remove(int index){ //如果链表里没有数据则不能删除 if(size==0){ System.out.println("list is empty"); } if(index<0||index>size-1){ System.out.println("out of array"); throw new ArrayIndexOutOfBoundsException(); } Object data=null;//用来存储返回值 if(index==0){ //删除的是第一个节点 data = head.data; head=head.next; size--; return data; }else{ Node p1=head,p2=null;//p1表示移动节点,p2是上一个节点 int i =0;//表示移动的距离 while (i<index){ p2=p1; p1=p1.next; i++; } data = p1.data; if(index==size-1){ p2.next = null; tail = p2; }else{ p2.next = p1.next; } size--; return data; } } public int size(){ return size; } public void addFirst(Object o){ add(0,o); } public Object removeFirst(){ return remove(0); } public Object removeLast() { return remove(size-1); } //内部节点类 static class Node{ public Object data; public Node next; } }