資料結構——列表
列表是常用的資料結構, 也是佇列和棧的基礎。本文將介紹兩種列表的簡單實現:陣列列表和連結串列。
public interface IList {
/**
* 插入
* @param i 位置
* @param data 要插入的資料
*/
void insert(int i, T data);
/**
* 獲取
* @param i 位置
* @return i 位置上的元素
*/
T get(int i);
/**
* 刪除
* @param i 位置
* @return 被刪除的元素
*/
T delete(int i);
/**
* 列表內元素的數量
* @return 數量
*/
int size();
/**
* 列表是否為空
* @return
*/
boolean isEmpty();
}
(測試用例不完全覆蓋)
public class MyArrayList implements IList {
private T[] datas;
private int count = 0;
private int capacity;
public MyArrayList(int capacity) {
datas = (T[]) new Object[capacity];
this.capacity = capacity;
}
@Override
public void insert(int i, T data) {
if (count == capacity)
throw new RuntimeException("列表已滿");
if (i count)
throw new RuntimeException("下標非法");
if (i == count)
datas[count++] = data;
else {
System.arraycopy(datas, i, datas, i + 1, count - i);
datas[i] = data;
count++;
}
}
@Override
public T get(int i) {
if (i = count)
throw new RuntimeException("下標非法");
return datas[i];
}
@Override
public T delete(int i) {
if (i = count)
throw new RuntimeException("下標非法");
T tmp = datas[i];
System.arraycopy(datas, i + 1, datas, i, count - i);
count--;
return tmp;
}
@Override
public int size() {
return this.count;
}
@Override
public boolean isEmpty() {
return this.size() == 0;
}
}
(用例不完全覆蓋)
public class MyLinkedList implements IList {
private int count = 0;
private Node head = new Node();
private class Node{
T data;
Node next;
public Node() {
}
Node(T data, Node next) {
this.data = data;
this.next = next;
}
}
@Override
public void insert(int i, T data) {
if (i this.count)
throw new RuntimeException("下標非法");
Node prev = getNode(i - 1);
prev.next = new Node(data, prev.next);
count++;
}
@Override
public T get(int i) {
if (i = count)
throw new RuntimeException("下標非法");
return this.getNode(i).data;
}
@Override
public T delete(int i) {
if (i = count)
throw new RuntimeException("下標非法");
Node prev = getNode(i - 1);
Node node = prev.next;
prev.next = node.next;
count--;
return node.data;
}
@Override
public int size() {
return this.count;
}
@Override
public boolean isEmpty() {
return this.size() == 0;
}
/**
* 得到第i個位置的元素
* 注意k的初始條件和while迴圈遞增
* @param i 若i為-1,返回head
* @return
*/
private Node getNode(int i) {
int k = - 1;
Node res = head;
while (k++
陣列列表的插入、刪除的時間複雜度是O(n),查詢的時間複雜度是O(1);
連結串列的插入、刪除的時間複雜度是O(1),查詢的時間複雜度是O(n);
因此,讀多寫少用陣列列表,寫多讀少用連結串列。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2001/viewspace-2808528/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (python)資料結構——列表Python資料結構
- Python常用資料結構(列表)Python資料結構
- 看得見的資料結構Android版之陣列表(資料結構篇)資料結構Android陣列
- python資料結構——連結串列(無序列表)Python資料結構
- 資料結構和演算法之-列表資料結構演算法
- Redis資料結構三之壓縮列表Redis資料結構
- Redis底層資料結構——壓縮列表Redis資料結構
- 深入剖析Redis系列(七) - Redis資料結構之列表Redis資料結構
- 圖解Redis之資料結構篇——壓縮列表圖解Redis資料結構
- Redis資料結構—整數集合與壓縮列表Redis資料結構
- 【Python_029】內建資料結構,列表 | 字典 | 集合 | 元組Python資料結構
- 結構化資料、半結構化資料和非結構化資料
- 【資料結構篇】認識資料結構資料結構
- 看得見的資料結構Android版之陣列表(檢視篇)資料結構Android陣列
- 資料結構小白系列之資料結構概述資料結構
- 資料結構資料結構
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 【PHP資料結構】PHP資料結構及演算法總結PHP資料結構演算法
- leetcode演算法資料結構題解---資料結構LeetCode演算法資料結構
- 從零開始學Python:第十一課-常用資料結構之列表Python資料結構
- 資料結構——樹資料結構
- Redis資料結構Redis資料結構
- 資料結構-樹資料結構
- 資料結構-Tree資料結構
- Python資料結構Python資料結構
- 資料結構-堆資料結構
- 資料結構-集合資料結構
- 資料結構 - 字串資料結構字串
- 資料結構---串資料結構
- 資料結構-棧資料結構
- Map 資料結構資料結構
- 【模板】資料結構資料結構
- 模板 - 資料結構資料結構
- 14 資料結構資料結構
- 資料結構 - 堆資料結構
- [資料結構]堆資料結構
- 資料結構 - 圖資料結構
- 資料結構 - 棧資料結構