顺序表的设计与实现List(Arraylist)

  1 //采用线性表实现一个list集合
  2 public class SeqList<T> extends Object {
  3     private Object[] elements;            //数组
  4     private int n;                        //长度
  5
  6     /**
  7      * 构造方法,根据传参创建空表
  8      * @param length
  9      */
 10     public SeqList(int length) {
 11         this.elements = new Object[length];
 12         this.n = length;
 13     }
 14
 15     /**
 16      * 空参构造将会调用本类已声明的指定参数列表的构造方法 进而创建一个空表,默认长度为64
 17      */
 18     public SeqList() {
 19         this(64);
 20     }
 21
 22     /**
 23      * 重载构造方法,根据传参确定表长度,并且将数组元素复制到成员变量elements中
 24      * @param values
 25      */
 26     public SeqList(T[] values) {
 27         this(values.length);          // 创建容量为values.length的空表
 28         for (int i = 0; i < values.length; i++) {
 29             this.elements[i] = values[i];  //复制数组元素
 30             this.n = elements.length;
 31         }
 32     }
 33
 34     /**
 35      * 判断顺序表是否为空,为空则返回true,时间复杂度为O(1)
 36      * @return
 37      */
 38     public boolean isEmpty() {
 39         return this.n == 0;
 40     }
 41
 42     /**
 43      * 返回顺序表元素个数,时间复杂度为O(1)
 44      * @return
 45      */
 46     public int size() {
 47         return this.n;
 48     }
 49
 50     /**
 51      * 返回第i个元素,若i越界则返回null,,时间复杂度为O(1)
 52      * @param i
 53      * @return
 54      */
 55     @SuppressWarnings("unchecked")
 56     public T get(int index) {
 57         if (index >= 0 && index < this.n) {
 58             return (T) this.elements[index];
 59         } else {
 60             return null;
 61         }
 62     }
 63
 64     /**
 65      * 替换指定位置的元素,若index越界,则抛出越界异常,若x为空,则抛出空对象异常,时间复杂度为O(1)
 66      * @param index
 67      * @param x
 68      */
 69     public void set(int index, T x) {
 70         if (x == null) {
 71             throw new NullPointerException("x==null");
 72         }
 73         if (index >= 0 && index < this.n) {
 74             this.elements[index] = x;
 75         } else {
 76             throw new java.lang.IndexOutOfBoundsException(index + "");
 77         }
 78     }
 79
 80     /**
 81      * 覆写Object的toString 方法,需要遍历,时间复杂度为O(n)
 82      */
 83     public String toString() {
 84         String str = this.getClass().getName() + "(";
 85         if (this.n > 0) {
 86             str += this.elements[0].toString();
 87         }
 88         for (int i = 0; i < this.n; i++) {
 89             str += "," + this.elements[i].toString();
 90         }
 91         return str + ")";
 92     }
 93
 94     /**
 95      * 在指定位置插入操作,index是插入的位置(下标),x是插入的元素
 96      * @param index
 97      * @param x
 98      * @return
 99      */
100     public int add(int index, T x) {
101         if (x == null) {
102             throw new NullPointerException("x==null");
103         }
104         // 对index进行容错处理,使下标index始终在数组长度范围内
105         if (index < 0) {
106             index = 0;
107         }
108         if (index > this.n) {
109             index = this.n;
110         }
111         // 复制原数组到一个新的数组source中
112         Object[] source = this.elements;
113         // 如数组满,则扩充顺序表的数组容量,通过重申请和复制完成
114         if (this.n == elements.length) {
115             this.elements = new Object[source.length +1];
116             // 复制当前数组前i-1个元素到新的数组中
117             for (int j = 0; j < index; j++) {
118                 this.elements[j] = source[j];
119             }
120         }
121         // x插入为第i个元素
122         this.elements[index] = x;
123         // 从i开始至表尾的元素往后移,次序从后向前,这些元素的下标都要加1
124         for (int j = this.n - 1; j >= index; j--) {
125             this.elements[j + 1] = source[j];
126         }
127         // 数组的长度增加
128         this.n++;
129         // 返回插入元素的下标
130         return index;
131     }
132     /*
133      * 重载add方法,在尾部插入元素
134      */
135     public int add(T x) {
136         return this.add(this.n, x);
137     }
138     /*
139      * 在尾部插入一个线性表对象
140      * @param newList
141      * @return
142      */
143     public int addAll(SeqList<T> newList) {
144         Object[] source = this.elements;
145         this.n = source.length + newList.size();
146         // 数组扩容
147         this.elements = new Object[n];
148         // 将原数组的元素拷贝到新数组中
149         for (int i = 0; i < source.length; i++) {
150             this.elements[i] = source[i];
151         }
152         // 将插入的集合元素拷贝到数组的后面
153         for (int j = 0; j < newList.size(); j++) {
154             this.elements[source.length + j] = newList.get(j);
155         }
156         return n;
157     }
158     /*
159      * 从指定位置index处开始插入一组元素
160      * @param index
161      * @param newList
162      * @return
163      */
164     public int addAll(int index,SeqList<T> newList) {
165         // 对index进行容错处理,使下标index始终在数组长度范围内
166         if (index < 0) {
167             index = 0;
168         }
169         if (index > this.n) {
170             index = this.n;
171         }
172         // 复制原数组到一个新的数组source中
173         Object[] source = this.elements;
174         this.n = source.length+newList.size();
175         this.elements = new Object[n];
176         //从source中拷贝index之前的元素
177         for (int j = 0; j < index; j++) {
178             this.elements[j] = source[j];
179         }
180         //从集合中取出元素拷贝到新数组中
181         for (int j = 0; j < newList.size(); j++) {
182             this.elements[j+index] = newList.get(j);
183         }
184         //从source中拷贝index之后的元素
185         for (int j = index; j < source.length; j++) {
186             this.elements[j+newList.size()] = source[j];
187         }
188         return n;
189     }
190
191     /**
192      * 删除元素,返回被删除元素,index之后的元素都要往前移一位
193      * @param index
194      */
195     @SuppressWarnings("unchecked")
196     public T remove(int index) {
197         T old = null;
198         if (index > this.n) {
199             index = this.n - 1;
200         }
201         if (index >= 0 && index < this.n) {
202             old = (T) this.elements[index]; // 被删除元素
203         }
204         // 复制原数组到source作为备份
205         Object[] source = this.elements;
206         // 前i个元素复制
207         for (int j = 0; j < index; j++) {
208             this.elements[j] = source[j];
209         }
210         // 后i个朝前挪一位
211         for (int j = index; j < this.n - 1; j++) {
212             this.elements[j] = source[j + 1];
213         }
214         this.n--;
215         return old;
216     }
217
218     /*
219      *  查找指定元素的位置,若不存在则返回-1
220      */
221     public int indexOf(T value) {
222         for (int i = 0; i < this.n; i++) {
223             if (value.equals(this.elements[i])) {
224                 return i;
225             }
226         }
227         return -1;
228     }
229
230     /*
231      * 顺序表比较相等 (non-Javadoc)
232      * @see java.lang.Object#equals(java.lang.Object)
233      */
234     public boolean equals(Object obj) {
235         // 同一个顺序表实例
236         if (this == obj) {
237             return true;
238         }
239         // SeqList<?>是所有SeqList<T>的父类
240         if (obj instanceof SeqList<?>) {
241             SeqList<T> slist = (SeqList<T>) obj;
242             if (this.n == slist.n) {
243                 for (int i = 0; i < this.n; i++) {
244                     if (!this.get(i).equals(slist.get(i))) {
245                         return false;
246                     }
247                     return true;
248                 }
249             }
250         }
251         return false;
252     }
253 }
时间: 2024-10-25 16:02:08

顺序表的设计与实现List(Arraylist)的相关文章

顺序表算法设计笔记

1.已知长度为 n 的线性表 A 采用顺序存储结构.设计一个时间复杂度为O(n).空间复杂度为O(1)的算法,该算法删除线性表中所有值为 x 的元素数据元素. 以下两种方法都不满足要求: 如果删除一个值为 x 的元素都进行移动, 其时间复杂度为O(n^2),时间复杂度为O(1). 如果借助一个新的顺序表, 存放将A中所有不为x的元素,其时间复杂度O(n), 空间复杂度为O(n). 解法一:设删除 A 中所有值等于 x 元素后的顺序表为A1, 显然A1包含在 A 中, 为此A1重用 A 的空间.

Java实现顺序表

利用顺序存储结构表示的顺序表称为顺序表. 它用一组连续的地址存储单元一次存放线性表中的数据元素. 顺序表的实现是数据结构中最简单的一种. 由于代码中已经有详细注释,代码外不再阐述. 下次再陈上关于顺序表的循环队列和顺序栈的代码. 1 package 线性表.顺序表.普通数组; 2 3 /** 4 * ArrayList 顺序表 5 * JAVA 3.0 6 * 抛异常处理错误的下标 7 * 使用泛型,当然如果要替换成Object也是可以替换 8 */ 9 public class ArrayLi

顺序表的一些重要操作

ArrayList 常用操作:构造方法:ArrayList(); 构造空的·顺序表,容量是默认容量ArrayList(int capacity); 构造空的顺序表,容量是CapacityArrayList(Collection c); 构造一个顺序表,把C中的所有元素放到顺序表中List<Integer> origin=Arrays.asList(1,2,3,4,5);ArrayList<Integer> list=new ArrayList<>(origin);常用方

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

设计一个算法将一个顺序表逆置

#include<iostream> #include<malloc.h> using namespace std; typedef struct { int length;//保存长度 int data[40];//数组 } SqList; /*算法1:设计一个高效的算法,将顺序表中的所有元素逆置.要求算法空间股咋度为o(1)*/ //初始化顺序表 void initReverse(SqList &s,int *a,int l){ s.length=0; //插入元素 f

Java数据结构-线性表之顺序表ArrayList

线性表的顺序存储结构,也称为顺序表,指用一段连续的存储单元依次存储线性表中的数据元素. 根据顺序表的特性,我们用数组来实现顺序表,下面是我通过数组实现的Java版本的顺序表. package com.phn.datestructure; /** * @author 潘海南 * @Email [email protected] * @TODO 顺序表 * @date 2015年7月16日 */ public class FOArrayList<E> { // 顺序表长度 private int

1.1顺序表基本操作的设计与实现

实现顺序表的基本操作,包括顺序表的建立,查找,求长度,查找前驱,插入,删除,输出等函数 #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define List_INIT_SPACE 100 //存储空间初始分配量 #define List_INC_SPACE 10

(java实现)顺序表-ArrayList

什么是顺序表 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 在使用顺序表存储数据前,会先申请一段连续的内存空间(即数组),然后把数组依次存入内存,中间没有一点空隙. 基本操作 每个数据结构都有集合对数据处理的方法,这能让我们更方便的使用保存在数据结构中的数据.顺序表的基本操作有:增(add),删(remove),改(set),查(find),插(insert)等. 在这里我们只详细讲解remove 和 insert 操作,其他实现可看下

C#顺序表

1 数据是外部世界的载体,能够被计算机处理加工.2数据元素是数据的基本单位,如,学生的姓名.性别.班级等等. 3数据对象是数据的一个集合,如 人类,狗类,等等属于数据对象,对象里又有数据元素 4数据类型,如整形,字符串,结构体等等, 5.数据结构通常分为4种,5.1集合 如HashSet<T>类主要是设计用来做高性能集运算的,(交集.并集.差集) 后续再谈HashSet<>. 5.2线性结构 数据元素从在一对一的关系 如 数组.list<>.Stack<>.