Java实现线性表

来源:互联网 发布:2012sql维护计划 编辑:程序博客网 时间:2024/05/29 19:16

线性表的实现方法一般有两种——顺序表和链表

首先定义一个接口,用于定义线性表应实现的功能

package List;public interface List<T> {//清空线性表void clear();//在线性表最前面插入元素boolean insert(T data);//在线性表的最后面插入元素boolean append(T data);//删除线性表的第一个元素boolean removed(T data);//把fence设置到第一个位置void setStart();//把fence设置到最后一个位置void setEnd();//把fence左移一个位置,如果在最开始,则不动void prev();//把fence右移一个位置,如果在最右边,则不动void next();//返回fence左边的长度int leftLength();//返回fence右边的长度int rightLength();//boolean setPos(int pos);//查看线性表里面是否有指定元素boolean getValue(T data);//打印输出线性表元素void print();}
顺序表实现
package List;public class AList<T> implements List<T> {private int maxSize;private int listSize;private int fence;Object[] listArray;public AList(int DefaultListSize){maxSize = DefaultListSize;listSize = fence = 0;listArray = new Object[maxSize];}@Overridepublic void clear() {for(int i = 0;i < listSize;i++){listArray[i] = null;}}@Overridepublic boolean insert(T data) {if(listSize < maxSize - 1){for(int i = listSize + 1;i >= 1;i--){listArray[i] = listArray[i-1];}listArray[0] = data;listSize++;return true;}return false;}@Overridepublic boolean append(T data) {if(listSize > maxSize - 1 ){reSize();listArray[listSize++] = data;return true;}return false;}@Overridepublic boolean removed(Object data) {if(listSize > 0 ){data = listArray[listSize-1];listSize--;return true;}return false;}@Overridepublic void setStart() {fence = 0;}@Overridepublic void setEnd() {fence = listSize;}@Overridepublic void prev() {if(fence != 0){fence--;}}@Overridepublic void next() {if(fence < listSize){fence++;}}@Overridepublic int leftLength() {return fence;}@Overridepublic int rightLength() {return listSize - fence;}@Overridepublic boolean setPos(int pos) {if(pos >= 0 && pos <=listSize)fence = pos;return (pos >= 0) && (pos <= listSize);}@Overridepublic boolean getValue(Object data) {if(rightLength() == 0) return false;else{data = listArray[fence];return true;}}@Overridepublic void print() {for(int i = 0;i < listSize;i++){System.out.print(listArray[i] + " ");}System.out.println();}public void reSize(){Object[] temp = new Object[maxSize*2];for(int i = 0;i < listSize;i++){temp[i] = listArray[i];listArray[i] = null;}listArray = temp;}public static void main(String[] args){AList al = new AList(20);long begin = System.currentTimeMillis();for(int i = 0;i < 1000000;i++){al.append(i);}long end = System.currentTimeMillis();long between = end - begin;System.out.println(between);//int a = 0;//al.removed(a);//al.print();}}
链表实现

package List;public class LList<T> implements List<T> {private class LinkNode{Object element;LinkNode next;public LinkNode(Object data,LinkNode next){this.element = data;this.next = next;}public LinkNode(LinkNode next){this.next = next;}}private LinkNode head;private LinkNode tail;private LinkNode fence;int leftcnt;int rightcnt;private void init(){fence = tail = head = new LinkNode(null);leftcnt = rightcnt = 0;}private void removeAll(){while(head != null){fence = head;head = head.next;fence = null;}}public LList(){init();}@Overridepublic void clear() {removeAll();init();}@Overridepublic boolean insert(Object data) {fence.next = new LinkNode(data,fence.next);if(tail == fence)tail = fence.next;rightcnt++;return true;}@Overridepublic boolean append(Object data) {tail = tail.next = new LinkNode(data,null);rightcnt++;return true;}@Overridepublic boolean removed(Object data) {if(fence.next == null)return false;data = fence.next.element;LinkNode ltemp = fence.next;fence.next = ltemp.next;if(tail == ltemp)tail = fence;ltemp = null;rightcnt--;return true;}@Overridepublic void setStart() {fence = head;rightcnt += leftcnt;leftcnt = 0;}@Overridepublic void setEnd() {fence = tail;leftcnt += rightcnt;rightcnt = 0;}@Overridepublic void prev() {if(fence != head){LinkNode ltemp = head;while(ltemp.next != fence){ltemp = ltemp.next;}fence = ltemp;leftcnt--;rightcnt++;}}@Overridepublic void next() {if(fence != tail){fence = fence.next;leftcnt++;rightcnt--;}}@Overridepublic int leftLength() {return leftcnt;}@Overridepublic int rightLength() {return rightcnt;}@Overridepublic boolean setPos(int pos) {if(pos < 0 && pos > rightcnt + leftcnt)return false;fence = head;for(int i = 0;i < pos;i++)fence = fence.next;return true;}@Overridepublic boolean getValue(Object data) {if(rightcnt == 0){return false;}data = fence.next.element;return true;}@Overridepublic void print() {LinkNode ltemp = head;while(ltemp != null){System.out.print(ltemp.element + " ");ltemp = ltemp.next;}System.out.println();}public static void main(String[] args){/*AList al = new AList(20);long begin = System.currentTimeMillis();for(int i = 0;i < 1000000;i++){al.append(i);}long end = System.currentTimeMillis();long between = end - begin;System.out.println(between);*/LList ll = new LList();//long begin1 = System.currentTimeMillis();for(int i = 0;i < 20;i++){ll.insert(i);}ll.print();System.out.println();//System.out.println(ll.head.element);//long end1 = System.currentTimeMillis();//long between1 = end1 - begin1;//System.out.println(between1);}}
双链表实现

package List;public class DLList<T> implements List<T> {private class DLink{Object element;DLink next;DLink prev;DLink(Object element,DLink prev,DLink next){this.element = element;this.next = next;this.prev = prev;}DLink(DLink next,DLink prev){this.next = next;this.prev = prev;}}private DLink fence;private DLink head;private DLink tail;private int leftcnt;private int rightcnt;private void init(){fence = tail = head  = new DLink(null,null);leftcnt = rightcnt = 0;}private void removeAll(){while(head != null){fence = head;fence = null;head = head.next;}}public DLList(){this.init();}@Overridepublic void clear() {removeAll();init();}@Overridepublic boolean insert(Object data) {fence.next = new DLink(data,fence,fence.next);if(fence.next.next != null)fence.next.next.prev = fence.next;if(tail == fence)tail = fence.next;rightcnt++;return true;}@Overridepublic boolean append(Object data) {tail = tail.next = new DLink(data,tail,null);rightcnt++;return true;}@Overridepublic boolean removed(Object data) {if(fence.next == null)return false;data = fence.next.element;DLink dltemp = fence.next;if(dltemp.next != null)dltemp.next.prev = fence;else tail = fence;rightcnt--;return true;}@Overridepublic void setStart() {fence = head;rightcnt += leftcnt;leftcnt = 0;}@Overridepublic void setEnd() {fence = tail;leftcnt += rightcnt;rightcnt = 0;}@Overridepublic void prev() {if(fence != head){fence = fence.prev;leftcnt--;rightcnt++;}}@Overridepublic void next() {if(fence != tail){fence = fence.next;rightcnt--;leftcnt++;}}@Overridepublic int leftLength() {return leftcnt;}@Overridepublic int rightLength() {return rightcnt;}@Overridepublic boolean setPos(int pos) {if(pos < 0 || pos > leftcnt+rightcnt)return false;fence = head;for(int i = 0;i < pos;i++){fence = fence.next;}return true;}@Overridepublic boolean getValue(Object data) {if(fence == tail)return false;data = fence.next.element;return true;}@Overridepublic void print() {DLink dltemp = head;while(dltemp != null){System.out.print(dltemp.element + " ");dltemp = dltemp.next;}System.out.println();}public static void main(String[] args){DLList dll = new DLList();for(int i = 0;i < 20;i++){dll.insert(i);}/*dll.append(1);System.out.println(dll.tail.next == dll.head);dll.insert(1);System.out.println(dll.tail.next == dll.head);*///dll.append(2);dll.print();//System.out.println("end");}}
注意:1、里面有问题没有解决,Java的传引用调用没有实现,所以删除时应通过返回值来返回被删除的对象

2、在使用的时候对象的定义应通过接口来定义,这样才符合面向对象机制