首先抽象出一个线性表抽象类(包括主要的增删操作)

public abstract class MyAbstractList<E> {
public abstract void add(E t);
public abstract void add(int index,E t);
public abstract void remove();
public abstract void remove(int index);
public abstract int getCount();
public abstract E get(int index);
public abstract String toString();
public abstract boolean contains(E e);
}

ArrayList2继承抽象类,并实现当中的全部抽象方法

public class ArrayList2<E> extends MyAbstractList<E>{
private E[] e;
private int len;
private int size; ArrayList2(){
this.size = 0;
this.len = 10;
this.e = (E[]) new Object[len];
} @Override
public void add(E t) {
// TODO Auto-generated method stub
ensureCap();
e[size] = t;
size++;
} private void ensureCap() {
// TODO Auto-generated method stub
if(getCount()>=len){
E[] temp = (E[]) new Object[len*2+1];
len = len*2+1;
for(int i=0;i<len;i++){
temp[i] = e[i];
}
}
} @Override
public void add(int index, E t) {
// TODO Auto-generated method stub
ensureCap();
for(int i=size-1;i>=index;i--){
e[i+1] = e[i];
}
e[index] = t;
size++;
} @Override
public void remove() {
// TODO Auto-generated method stub
e[size] = null;
size--;
} @Override
public void remove(int index) {
// TODO Auto-generated method stub
for(int i=index;i<size-1;i++){
e[index] = e[index+1];
}
e[size] = null;
size--;
} @Override
public E get(int index){
if(index>0 && index<size){
return e[index];
}
else return null;
} public boolean isEmpty(){
return size>0? false : true;
} @Override
public int getCount() {
// TODO Auto-generated method stub
return size;
} @Override
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append("[");
for(int i=0;i<size-1;i++){
sb.append(e[i]).append(",");
}
sb.append(e[size-1]);
sb.append("]");
return sb.toString().trim();
} @Override
public boolean contains(E e1){
boolean bool = false;
for(int i=0;i<size;i++){
if(e[i] == e1){
bool = true;
}
} return bool;
} }

LinkedList2 继承抽象类,并实现方法

public class LinkedList2<E> extends MyAbstractList<E> {

	private int size;
private Node<E> head; public LinkedList2(){
this.size = 0;
head = null;
}
@Override
public void add(E t) {
// TODO Auto-generated method stub
Node<E> e = new Node<E>(t);
if(size == 0) head = e;
else{
Node temp = head;
while(temp.next!=null){
temp = temp.next;
}
temp.next = e;
size++;
}
} @Override
public void add(int index, E t) {
// TODO Auto-generated method stub
if(index == 0 || index>size) add(t);
else{
Node current = head;
Node<E> e = new Node<E>(t);
for(int i=0;i<index-1;i++){
current = current.next;
}
e.next = current.next;
current.next = e;
size++;
}
} @Override
public void remove() {
// TODO Auto-generated method stub
remove(size-1);
} @Override
public void remove(int index) {
// TODO Auto-generated method stub
if(index == 0) removeFirst();
else if(index == size) removeLast();
else if(index<0 || index>size) ;
else{
Node<E> pre = head;
for(int i=0;i<index-1;i++){
pre = pre.next;
}
Node<E> current = pre.next;
pre.next = current.next;
size--;
}
} private void removeLast() {
// TODO Auto-generated method stub
if(size == 0) ;
else{
Node<E> current = head;
for(int i=0;i<size-2;i++){
current = current.next;
}
current.next = null;
size--;
}
}
private void removeFirst() {
// TODO Auto-generated method stub
head = head.next;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return size;
} @Override
public E get(int index) {
// TODO Auto-generated method stub
Node<E> current = head;
for(int i=0;i<index-1;i++){
current = current.next;
}
return current.e;
} @Override
public String toString() {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer();
sb.append("[");
Node<E> current = head;
for(int i=0;i<size;i++){
sb.append(current.e).append(",");
}
sb.append("]");
return sb.toString().trim();
} @Override
public boolean contains(E e) {
// TODO Auto-generated method stub
if(size == 0 ) return false;
else{
Node<E> current = head;
for(int i=0;i<size-1;i++){
if(current.e == e) return true;
current = current.next;
}
return false;
} } } /**
* 链表结点
*/
class Node<E>{
E e;
Node<E> next;
Node(){
this.next = null;
}
Node(E ee){
e = ee;
next = null;
}
}

线性表 顺序存储 链式存储 ---java实现的更多相关文章

  1. C++线性表的链式存储结构

    C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素 ...

  2. C 线性表的链式存储实现及插入、删除等操作示例

    一.链式存储的优势 线性表的存储可以通过顺序存储或链式存储实现,其中顺序存储基于数组实现(见本人上一篇博客),在进行插入删除等操作时,需对表内某一部分元素逐个移动,效率较低.而链式结构不依赖于地址连续 ...

  3. C++编程练习(2)----“实现简单的线性表的链式存储结构“

    单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...

  4. 数据结构-线性表的链式存储相关算法(C语言实现)

    链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...

  5. 线性表的链式存储——C语言实现

    SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...

  6. typedef struct LNode命名结构指针(线性表的链式存储)

    一.typedef 关键字 1. 简介: typedef工具是一个高级数据特性,利用typedef可以为某一些类型自定义名称. 2. 工作原理: 例如我们定义链表的存储结构时,需要定义结点的存储数据元 ...

  7. 线性表的链式存储C语言版

    #include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...

  8. 线性表的链式存储结构的实现及其应用(C/C++实现)

    存档----------- #include <iostream.h> typedef char ElemType; #include "LinkList.h" voi ...

  9. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

随机推荐

  1. Redis_常见JedisConnectionException异常分析

    最近项目开发中用到了Redis, 选择了官网推荐的java client Jedis.Redis常用命令学习:http://redis.io/commandsRedis官方推荐Java客户端Jedis ...

  2. webbench1.5源码读后总结

    webbench简介 webbench由C语言写成的用于网站压力测试的一个非常简单的工具,它最多可以模拟30000个并发连接去进行测试. webbench的安装和使用可以自行百度,也可以过下这篇文章. ...

  3. [Linux] VIM Practical Note

    Practical Vim 文件 1.1. 管理多个文件 1.1.1. 缓冲区 • :ls • 查看缓冲区列表 • :bprev • 前一项 • :bnext • 后一项 • :bfirst • 第一 ...

  4. 如何在发型不乱的前提下应对单日十亿计Web请求

    原文地址:http://developer.51cto.com/art/201502/464640.htm 就在不久之前,AppLovin移动广告平台的单一广告请求数量突破了200亿大关——相当于每一 ...

  5. mac 拷贝文件时报错 8060 解决方案

    解决如下: 即某文件夹下出现多重子目录,级数很多,删除多余的子文件夹即可. 至于如何产生的,有人说是xcode升级导致,不过没有见证 .我的不属于这类情况的. (参见:http://macosx.co ...

  6. 新手学习selenium路线图(老司机亲手绘制)-学前篇

    前言: 本来这篇是只在微信公众号(yoyoketang)上发布的,最近一搜,发现本很多人copy(copy公众号的,图片是加载不出来的)了,还没注明出处,不想多说什么,博客上也同步更新这篇吧! 最近群 ...

  7. Python3.6学习笔记(二)

    Python 的高级特性 切片 对于指定索引范围取值的操作,Python提供了slice方法,类似于Excel中数据透视表的切片器. >>> L = ['Michael', 'Sar ...

  8. Objective-C:深复制(拷贝)

    深复制:复制对象时,如果对象中包含对象类型的实例变量,要对对象类型的实例变量也要做对象复制.新对象中的对象类型实例变量和旧对象中的对象类型实例变量指的是不同的对象.不管任何一方实例变量对对象做修改,都 ...

  9. Redis设计与实现读书笔记——简单动态字符串

    前言 项目里用到了redis数据结构,不想只是简单的调用api,这里对我的读书笔记做一下记录.原文地址: http://www.redisbook.com/en/latest/internal-dat ...

  10. C++ Explicit Constructors(显式构造函数)

    C++ 为类(Class)提供了许多默认函数.如果自己没有申明,编译器会为我们提供一个copy构造函数.一个copy assignment操作符和一个析构函数.此外,如果没有申明任何构造函数,编译器会 ...