`

链表 java实现

阅读更多
package com.shine.linearList;
/*
* 单链表结点类
*/
public class Node<T> {
public T data;      
public Node<T> next;
public Node(T data,Node<T> next){
this.data = data;
this.next = next;
}
public Node(){
this(null,null);
}
}




package com.shine.linearList;
/*
* 线性表接口
* 2015-01-19
* QiZhang
*/
public interface LList<T> {
boolean isEmpty();//判断是否为空
int length();//返回线性表长度
T get(int i);//得到第i个元素
void set(int i,T x);//设置第i个元素为x
void insert(int i,T x);//插入x作为第i个元素
void append(T x);//在线性表末尾添加x元素
T remove(int i);//删除第i个元素
void removeAll();//删除所有元素
T search(T key);//查找key元素
}



package com.shine.linearList;
/*
* 顺序表类
*/
public class SeqList<T> implements LList<T> {
    private Object[] element;
    private int len;
    public SeqList(int size) {//构造方法,创建长度为size的空表
this.element = new Object[size];
this.len = 0;
}
@Override
public boolean isEmpty() {
return len ==0;
}
@Override
public int length() {
return this.len;
}

@Override
public T get(int i) {
if(i>=0&&i<element.length)
return (T)element[i];
else
    return null;
}

@Override
public void set(int i, T x) {
if(x==null)
return;
if(i>=0&&i<element.length)
element[i] = x;
else
throw new IndexOutOfBoundsException(i+" i的数值超过了数组范围");
}

@Override
public void insert(int i, T x) {
if(x==null)
return;
if(this.len==element.length){//如果数组满,则扩充数组容量
Object[] temp = this.element;
this.element = new Object[temp.length*2];
for(int j=0;j<temp.length;j++)
this.element[j] = temp[j];
if(i<0)
i=0;
if(i>this.len)
i=this.len;
for(int j=this.len-1;j>=i;j--)//元素向后移动
this.element[j+1] = this.element[j];
this.element[i] = x;
this.len++;
}
}

@Override
public void append(T x) {
insert(this.len,x);
}

@Override
public T remove(int i) {
if(this.len==0||i<0||i>=this.len)
return null;
T old = (T)this.element[i];
for(int j=i;j<this.len-1;j++)
this.element[j]= this.element[j+1];
this.element[this.len-1]=null;
this.len--;
return old;
}

@Override
public void removeAll() {
this.len=0;
}

@Override
public T search(T key) {
int find = indexOf(key);
return find==-1? null : (T)this.element[find];
}
//顺序查找关键字为key的元素,返回首次出现的元素的下表,若查找不成功返回-1
public int indexOf(T key){
if(key!=null)
for(int i=0;i<this.len;i++)
if(this.element[i].equals(key))
return i;
return -1;
}
    @Override
    public String toString() {
    String str="(";
    if(this.len>0)
    str += this.element[0].toString();
    for(int i=1;i<this.len;i++)
    str += ","+this.element[i].toString();
    return str+")";
    }
}



package com.shine.linearList;
/*
* 带头节点的单链表
*/
public class SinglyLinkedList<T> implements LList<T> {
    protected Node<T> head;
    //默认构造方法,构造空单链表。创建头结点,data和next的值均为null
    public SinglyLinkedList(){
    this.head=new Node<T>();
    }
    //由指定数组中的多个对象构造单链表,采用尾插入的方式构造单链表
    public SinglyLinkedList(T[] element){
    this();
    Node<T> rear = this.head;
    for(int i=0;i<element.length;i++){
    rear.next = new Node<T>(element[i],null);
    rear = rear.next;
    }
    }
@Override
public boolean isEmpty() {
return this.head.next==null;
}

@Override
public int length() {
int i=0;
Node<T> p = this.head.next;
while(p!=null){
i++;
p=p.next;
}
return i;
}

@Override
public T get(int i) {
if(i>0){
Node<T> p= this.head.next;
for(int j=0;p!=null&&j<i;j++)
p = p.next;
if(p!=null)
return p.data;
}
return null;
}

@Override
public void set(int i, T x) {
if(x==null)
return;
if(i>=0){
Node<T> p = this.head.next;
for(int j=0;p!=null&&j<i;j++)
p = p.next;
if(p!=null){
p.data = x;
}
else throw new IndexOutOfBoundsException(i+" ");

}

}

@Override
public void insert(int i, T x) {
if(x==null)
return;
Node<T> p = this.head;
for(int j=0;p.next!=null&&j<i;j++)
p = p.next;
p.next = new Node<T>(x,p.next);
}

@Override
public void append(T x) {
insert(Integer.MAX_VALUE,x);
}

@Override
public T remove(int i) {
if(i>0){
Node<T> p = this.head;
for(int j=0;p.next!=null&&j<i;j++)
p = p.next;
if(p.next!=null){
T old = p.next.data;
p.next = p.next.next;
return old;
}
}
return null;
}

@Override
public void removeAll() {
this.head.next = null;

}

@Override
public T search(T key) {
if(key==null)
return null;
Node<T> p = this.head.next;
while(p!=null){
if(p.data.equals(key))
return p.data;
p = p.next;
}
return null;
}
    public String toString() {
String str = "(";
Node<T> p = this.head.next;
while(p!=null){
str += p.data.toString();
if(p.next!=null)
str += ",";
p = p.next;
}
        return str+")";
}
}



package com.shine.linearList;
/*
* 双链表节点类
*/
public class DLinkNode<T> {
public T data;
public DLinkNode<T> prev,next;
public DLinkNode(T data,DLinkNode<T> prev,DLinkNode<T> next){
this.data = data;
this.prev = prev;
this.next = next;
}
public DLinkNode(){
this(null,null,null);
}
}



package com.shine.linearList;
/*
* 双链表
*/
public class DoublyLinkedList<T> implements LList<T> {

@Override
public boolean isEmpty() {
return true;
}

@Override
public int length() {
// TODO Auto-generated method stub
return 0;
}

@Override
public T get(int i) {
// TODO Auto-generated method stub
return null;
}

@Override
public void set(int i, T x) {
// TODO Auto-generated method stub

}

@Override
public void insert(int i, T x) {
// TODO Auto-generated method stub

}

@Override
public void append(T x) {
// TODO Auto-generated method stub

}

@Override
public T remove(int i) {
// TODO Auto-generated method stub
return null;
}

@Override
public void removeAll() {
// TODO Auto-generated method stub

}

@Override
public T search(T key) {
// TODO Auto-generated method stub
return null;
}

}





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics