只有当自己去写一遍数据结构时,才能真正体会到其中的妙处,多思考数据结构的写法为什么不用其他的方式,有助于对代码的理解。
本文的注释较为详细,细节之处请看代码对应的注释。
package datastructure;
public class LinkedList<A> {
public Node<A> head ;
private int length = 0;
public LinkedList(){
this.head = new Node<A>();
}
public LinkedList(A[] val){
this();
Node<A> rear = this.head;
for(int i=0;i<val.length;i++){
rear.next = new Node<A>(val[i]);
rear = rear.next;
length++;
}
}
public boolean isEmpty(){
return this.head.next == null;
}
public A get(int index){
Node<A> p = this.head.next;
p = head ;
if(index<0||p==null)
return null;
for(int i=0;i<=index&&p!=null;i++)
p=p.next;
return p.data;
}
public void set(int i,A x){
Node<A> p = this.head.next;
for(int j=0;j<i;j++){
p = p.next;
}
p.data = x;
}
public int size(){
return length;
}
public String toString(){
String s = this.getClass().getName()+"(";
for(Node<A> p=this.head.next;p!=null;p=p.next){
s+=p.data.toString();
if(p.next!=null)
s+=",";
}
return s+")";
}
public Node<A> insert(int index,A data){
if(data==null)
throw new NullPointerException("data=null");
Node<A> front = this.head;
for(int i=0;i<index&&front.next!=null;i++){
front = front.next;
}
front.next = new Node<A>(data);
length++;
return front.next;
}
public Node<A> insert(A data){
length++;
return insert(length,data);
}
public A remove(int index){
if(index>=length||index<0){
return null;
}else{
Node<A> front = this.head;
for(int i=0;i<index;i++){
front = front.next;
}
A oldData = front.next.data;
front = front.next.next;
length--;
return oldData;
}
}
public A remove(){
return remove(--length);
}
public void clear(){
this.head.next = null;
}
public Node<A> search(A key){
Node<A> p = this.head.next;
while(p!=null){
if(p.data==key)
break;
p = p.next;
}
return p;
}
public boolean contains(A key){
Node<A> p = search(key);
if(p==null)
return false;
return true;
}
public Node<A> insertDifferent(A x){
if(contains(x))
return null;
return insert(x);
}
public A remove(A x){
Node<A> p=this.head.next;
for(int i=0;p!=null;p=p.next,i++){
if(p.data==x)
return remove(i);
}
return null;
}
public void travelAll(){
Node<A> p = head.next;
System.out.println("All elements is:");
while(p!=null){
System.out.print(p.toString()+" ");
p=p.next;
}
}
}
class Node<A> {
protected A data;
protected Node<A> next;
public Node(){
this.data = null;
}
public Node(A data){
this.data = data;
}
public String toString(){
return data.toString();
}
}