Java實現資料結構之線性結構
一、順序表
順序表本質是使用陣列儲存陣列的一種資料結構,在計算機的儲存中是連續的分配記憶體的。
下面是我自己使用java 實現的簡單順序表結構
package list;
public class MyArrayList<E> {
private Object[] data; // 資料
private int length; // 目前長度
private int size; // 容量
// 空構造器 預設容量 10
public MyArrayList(){
this(10);
}
/**
* 初始化表自定義容量
* @param size
*/
public MyArrayList(int size){
if(size<0){
throw new RuntimeException(" 定義表容量錯誤 :"+size);
}else {
this.data = new Object[size];
this.size = size;
this.length = 0;
}
}
/**
* 判斷容量是否足夠,若不夠則擴充 10
*/
public void SizeIsEnough(){
if(this.length>=this.size){
Object[] newData = new Object[this.size+10];
this.size = size+10;
}
}
/**
* 向表末尾插入一個元素
* @param e 插入的元素
*/
public void add(E e){
data[length++] = e;
}
/**
* 向表的指定位置插入一個元素
* @param e 插入元素的值
* @param index 插入的位置
*/
public void add(E e,int index){
SizeIsEnough();
if(index<0|| index>=length+1){
throw new RuntimeException(" 插入元素位置錯誤 "+index);
}
for(int i=length++; i>=index; i--){
data[i] = data[i-1];
}
data[index] = e;
}
/**
* 移除指定位置的元素
* @param index 移除元素的位置
*/
public E remove(int index){
if(index<0||index>=length){
throw new RuntimeException(" 刪除元素位置錯誤 "+index);
}
E e = Get(index);
for(int i=index;i<--length;i++){
data[i] = data[i+1];
}
return e;
}
/**
* 移除最後一個元素
* @return 返回被移除的元素
*/
public E remove(){
return remove(length-1);
}
/**
* 獲取指定位置的元素
* @param index 獲取元素的位置
* @return 獲取的元素的值
*/
public E Get(int index){
if(index<0||index>=length){
throw new RuntimeException(" 查詢元素位置錯誤 "+index);
}
E e = (E) data[index];
return e;
}
/**
* 獲取指定值的元素的位置
* @param e
* @return
*/
public int Get(E e){
for(int i=0; i<length ;i++) {
if (data[i].equals(e)) {
return i;
}
}
return -1;
}
public int Length() {
return length;
}
public static void main(String[] args) {
MyArrayList<String> list = new MyArrayList<>();
list.add("ming");
list.add("king");
list.add("ling");
for(int i=0;i<list.Length();i++){
System.out.println(list.Get(i));
}
list.remove(2);
list.add("ling",2);
for(int i=0;i<list.Length();i++){
System.out.println(list.Get(i));
}
}
}
二、連結串列
連結串列是本質上使用指標儲存下一個元素的地址,從而可以在外匯返傭http://www.fx61.com/記憶體中找到下一個元素,形成一個鏈式的結構。java 中沒有指標的概念,當時 java 物件導向的本質就是指標,所以可以使用類作為指標的替代。
以下是我自己實現的簡單的單連結串列
package list;
public class MyLinkList<E> {
private Node<E> head=null;
private int size=0;
/**
* 新增元素
*/
public void add(E e){
Node<E> node = new Node<>();
node.setData(e);
if(head == null){
head = node;
size++;
return;
}
assert false;
Node<E> tmp = head;
while (tmp.hasNext()){
tmp = tmp.getNext();
}
tmp.setNext(node);
size++;
}
/**
* 刪除指定位置的元素
* @param index
* @return
*/
public E remove(int index){
Node<E> tmp = head;
Node<E> preNode;
Node<E> currNode;
int count=0;
if(index < 0 || index >size-1){
throw new RuntimeException(" 刪除位置錯誤 "+index);
}
while (tmp.hasNext()&&count != index-1){
tmp = tmp.getNext();
count++;
}
preNode = tmp;
currNode = tmp.getNext();
assert currNode != null;
preNode.setNext(currNode.getNext());
size--;
return currNode.getData();
}
public int Size(){
return size;
}
/**
* 移除連結串列尾部元素
* @return
*/
public E remove(){
return remove(size-1);
}
/**
* 獲取指定位置的元素
* @param index
* @return
*/
public E get(int index){
Node<E> tmp = head;
int count=0;
if(index < 0 || index > size-1){
throw new RuntimeException(" 查詢位置錯誤 "+index);
}
while (tmp.hasNext() && count != index){
tmp = tmp.getNext();
count++;
}
return tmp.getData();
}
public static void main(String[] args) {
MyLinkList<String> linked = new MyLinkList<>();
linked.add("ming");
linked.add("ling");
linked.add("ping");
linked.add("king");
for (int i = 0; i < linked.size; i++) {
System.out.println(linked.get(i));
}
String s = linked.remove();
for (int i = 0; i < linked.size; i++) {
System.out.println(linked.get(i));
}
System.out.println(s);
}
}
class Node<E> {
private E data;
private Node<E> next = null;
public E getData() {
return data;
}
public void setData(E data) {
this.data = data;
}
public Node<E> getNext() {
return next;
}
public void setNext(Node<E> next) {
this.next = next;
}
public boolean hasNext(){
return next != null;
}
}
實現線性表有兩種方式。第一種是使用陣列儲存線性表的元素。陣列是動態建立的。超過陣列的容量時,建立一個新的更大的陣列,並且將當前陣列中的元素複製到新建的陣列中。另一種方法是用連結串列結構實現。連結串列由節點組成,每個結點都是動態生成的,用來儲存一個元素。所有的結點連線成一個線性表。
本文講述使用變長陣列實現線性表
實現程式碼
package com.billJiang.array;
import java.util.Arrays;
import java.util.Collection;
/**
* Created by billJiang on 2016/11/30.
* 變長陣列
*/
public class ArrayList<T> {
private static final int INITIAL_SIZE = 10;
private int size = 0;
private T[] array;
public ArrayList(int initial) {
if (initial <= 0)
initial = INITIAL_SIZE;
array = (T[]) new Object[initial];
}
public void add(T item) {
// 陣列擴容
if (size == array.length) {
array = Arrays.copyOf(array, size * 2);
}
array[size++] = item;
}
public T get(int index) {
if (index >= size || index < 0) {
throw new IndexOutOfBoundsException(" 獲取的元素超出了陣列的界限 ");
}
return array[index];
}
public T set(int index, T item) {
T oldItem = this.get(index);
array[index] = item;
return oldItem;
}
public int size() {
return this.size;
}
}
測試程式碼
package com.billJiang.array;
/**
* Created by billJiang on 2016/11/30.
*/
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Integer> arrayList=new ArrayList<Integer>(3);
arrayList.add(new Integer(1));
arrayList.add(new Integer(2));
arrayList.add(new Integer(3));
System.out.println(arrayList.size());
arrayList.add(new Integer(4));
arrayList.set(3,5);
System.out.println(arrayList.size());
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946279/viewspace-2660341/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【資料結構之線性表總結】資料結構
- 資料結構與演算法之線性結構資料結構演算法
- 前端資料結構--線性結構-連結串列前端資料結構
- 資料結構之通用樹結構的實現資料結構
- 基本線性資料結構的Python實現資料結構Python
- [資料結構] - 線性表資料結構
- 資料結構 | 線性表資料結構
- 資料結構——線性表資料結構
- 資料結構-線性表資料結構
- 資料結構—線性表資料結構
- Java資料結構之線性表-Java那些事兒專欄Java資料結構
- 資料結構:線性表(Python實現基本操作)資料結構Python
- 資料結構:線性表的順序實現2.2資料結構
- 資料結構中的線性表程式碼實現資料結構
- 考研資料結構複習之線性表資料結構
- 資料結構-線性表、連結串列資料結構
- java 資料結構 之 佇列的實現 (二)Java資料結構佇列
- 資料結構之php實現棧資料結構PHP
- 資料結構和演算法(一)線性表實現資料結構演算法
- Java學習筆記:資料結構之線性表(雙向連結串列)Java筆記資料結構
- JAVA資料結構之連結串列Java資料結構
- 資料結構實驗之查詢七:線性之雜湊表資料結構
- 【資料結構】線性表-單連結串列資料結構
- 資料結構基礎學習之線性表資料結構
- php實現基本資料結構之連結串列PHP資料結構
- 線性表__資料結構筆記資料結構筆記
- 資料結構:線性表-例題資料結構
- Java棧資料結構的實現方式Java資料結構
- 資料結構實驗三:線性表綜合實驗資料結構
- 資料結構之php實現陣列資料結構PHP陣列
- 資料結構之php實現佇列資料結構PHP佇列
- 資料結構 - 圖之程式碼實現資料結構
- 資料結構與演算法——常用高階資料結構及其Java實現資料結構演算法Java
- 線性結構總結
- 資料結構:特殊的線性表之 棧 & 佇列資料結構佇列
- 資料結構之php實現單向連結串列資料結構PHP
- 資料結構之斐波那契數列java實現資料結構Java
- 線性結構-線性表