链表 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;
}

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值