您的位置:首页 > 编程语言 > Java开发

链表用java实现简单单链表linkedlist

2015-12-10 20:12 746 查看
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

每个结点包括两个部分:

1是存储数据元素的数据域data

2是存储下一个结点地址的指针域p。

相比于线性表的优点:插入和删除结点方便。(插入删除的图都不画了,办公软件不好用)

这里是对单链表的理解,并用java的泛型实现,当然与java集合提供的API  LinkedList<E>还是有些不同的,在此只作为理解。

project






首先构造一个Node结点泛型类,结点里的数据类型是泛型E

public class Node<E> {
E element;//元素
Node<E> next; //指针
public Node(E e){
element=e;
}
}
MyAbstractList.java抽象类实现MyList.java,对接口部分实现,MyLinkedList.java继承MyAbstractList.java抽象类
MyList.java
public interface MyList<E> {
//添加一个元素
public void add(E e);
//在index处添加一个元素
public void add(int index,E e);
//清楚一个list列表
public void clear();
//删除一个元素
public boolean remove(E e);
//删除并返回index处的元素
public E remove(int index);
//index处的元素设置为元素e
public Object set(int index,E e);
//判断是否包含元素e
public boolean contains(E e);
//返回index处的元素
public E get(int index);
//返回列表中第一个与元素e匹配的下标index
public int indexOf(E e);
//返回列表中最后一个与元素e匹配的元素下标index
public int lastIndeOf(E e);
//判断列表是否为空
public boolean isEmpty();
//返回列表的大小
public int size();
}
MyAbstractList.java

public abstract class MyAbstractList<E> implements MyList<E> {//部分实现MyList接口
protected int size=0;
protected MyAbstractList(){

}
protected MyAbstractList(E[] objects){
for(int i=1;i<objects.length;i++)
add(objects[i]);
}
@Override
public void add(E e){
add(size,e);
}
@Override
public void add(int index,E e){

}
@Override
public boolean isEmpty(){
return size==0;
}
@Override
public int size(){
return size;
}
@Override
public boolean remove(E e){
if(indexOf(e)>=0){
remove(indexOf(e));
return true;
}
else return false;
}
@Override
public E remove(int index){
return null;
}
@Override
public void clear() {
// TODO Auto-generated method stub

}
@Override
public Object set(int index, E e) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean contains(E e) {
// TODO Auto-generated method stub
return false;
}
@Override
public E get(int index) {
// TODO Auto-generated method stub
return null;
}
@Override
public int indexOf(E e) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int lastIndeOf(E e) {
// TODO Auto-generated method stub
return 0;
}
}



MyLinkedList.java

public class MyLinkedList<E> extends MyAbstractList<E>{
private Node<E> head,tail;
public MyLinkedList(){
}
public MyLinkedList(E[] objects){
super(objects);
}
//返回头元素
public E getFirst(){
if(size==0){
return null;
}
else{
return head.element;
}
}
//返回尾元素
public E getLast(){
if(size==0){
return null;
}
else{
return tail.element;
}
}
//添加首元素
public void addFirst(E e){
Node<E> newNode=new Node<E>(e);
newNode.next=head;
head=newNode;
size++;
if(tail==null)
tail=head;
}
//添加尾元素
public void addLast(E e){
Node<E> newNode=new Node<E>(e);
if(tail==null){
head=tail=newNode;
}
else{
tail.next=newNode;
tail=tail.next;
}
size++;
}
//在index处添加元素
public void add(int index,E e){
if(index==0) addFirst(e);
else if(index>=size) addLast(e);
else{
Node<E> current=head;
for(int i=1;i<index;i++)
current=current.next;
Node<E> temp=current.next;
current.next=new Node<E>(e);
(current.next).next=temp;
size++;
}
}
//删除并返回首元素
public E removeFirst(){
if(size==0)return null;
else if(size==1){
Node<E> temp=head;
head=tail=null;
size=0;
return temp.element;
}
else{
Node<E> temp=head;
head=head.next;
size--;
return temp.element;
}
}
//删除并返回尾元素
public E removeLast(){
if(size==0)return null;
else if(size==1){
Node<E> temp=head;
head=tail=null;
size=0;
return temp.element;
}
else{
Node<E> current=head;
for(int i=0;i<size-2;i++){
current=current.next;
}
Node<E> temp=tail;
tail=current;
tail.next=null;
size--;
return temp.element;
}
}
//删除并返回index处的元素
public E remove(int index){
if(index<0||index>=size) return null;
else if(index==0) return removeFirst();
else if(index==size-1) return removeLast();
else{
Node<E> previous=head;
for(int i=1;i<index;i++){
previous=previous.next;
}
Node<E> current=previous.next;
previous.next=current.next;
size--;
return current.element;
}
}
public String toString(){
StringBuilder result=new StringBuilder("[");
Node<E> current=head;
for(int i=0;i<size;i++){
result.append(current.element);
current=current.next;
if(current!=null){
result.append(",");
}
else{
result.append("]");
}
}
return result.toString();
}
public void clear(){
head=tail=null;
}
//是否包含元素e
public boolean contains(E e){
Node<E> current=head;
for(int i=0;i<size;i++){
if(current.element.equals(e)){
return true;
}
else{
current=current.next;
}
}
return false;
}
//返回index处的元素
public E get(int index){//index都是从0 算起的,size是从1算起的
if(index<0||index>=size) return null;
else if(index==0) return head.element;
else if(index==size-1) return tail.element;
else{
Node<E> current=head;
for(int i=1;i<index;i++)
current=current.next;
Node<E> temp=current.next;
return temp.element;
}
}
public int indexOf(E e){
if(size==0) return -1;
else {
Node<E> current=head;
for(int i=0;i<size;i++){
if(current.element.equals(e))
return i;
else current=current.next;
}
}
return -1;
}
public int lastIndexOf(E e){
if(size==0) return -1;
else {
Node<E> current=tail;
for(int i=size-1;i>=0;i--){
if(current.element.equals(e))
return i;
else current=current.next;
}
}
return -1;
}
//在index处的元素设置为e
public E set(int index,E e){
if(index<0||index>=size) return null;
else{
Node<E> current=head;
for(int i=1;i<index;i++)
current=current.next;
Node<E> old=current.next;
E oldE=old.element;
old.element=e;
return oldE;
}
}
}

TestMyLinkedList.java
public class TestMyLinkedList {
public static void main(String[] args) {

MyList<String> list=new MyLinkedList<>();
list.add("America");
System.out.println("(1)"+list);

list.add(0,"Canada");
System.out.println("(2)"+list);

list.add("Russia");
System.out.println("(3)"+list);

list.add("France");
System.out.println("(4)"+list);

list.add(2,"Gemany");//在索引2的位置插入
System.out.println("(5)"+list);

list.add(5,"Norway");//在索引5的位置插入
System.out.println("(6)"+list);

list.remove("Canada");//移出
System.out.println("(7)"+list);

list.remove("2");//移出索引2的元素
System.out.println("(8)"+list);

list.remove(list.size()-1);
System.out.println("(9)"+list);
}

}

测试结果:
(1)[America]

(2)[Canada,America]

(3)[Canada,America,Russia]

(4)[Canada,America,Russia,France]

(5)[Canada,America,Gemany,Russia,France]

(6)[Canada,America,Gemany,Russia,France,Norway]

(7)[America,Gemany,Russia,France,Norway]

(8)[America,Gemany,Russia,France,Norway]

(9)[America,Gemany,Russia,France]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息