ArrayList とLinkedListの区別(最後に説明)
javaのチェーンリスト(鎖表)「链表」
チェーンリストを勉強する前に線形リストを知るべきです
線形リストとは?
例えば、
Aさん、Bさん、Cさん、Dさん四人がいます。
あなたがDさんを探したい
ー>まずAさんに聞く、”Bさんが知っているかも”とAさんが言った。
ー>Bさんに聞く、”Cさんが知っているかも”とBさんが言った。
ー>Cさんに聞く、”公園にいますよ”とCさんが言った。
ー>結局公園でDさんを見つけた。
次の図を見て
まずAさんに聞くことは「先頭のノードを指すポインタ」
ABC三人は「データ」
ABC三人言った言葉は「ポインタ」
この「ポインタ」によって、次のデータを探す
1.チェーンリストに挿入
Node nextNode = null;
Node insNode = new Node<T>(element,nextNode);// ここは挿入するノード
nextNode = getNodeByIndex(index);// index索引で見つけたノードはnextNodeとして
Node preNode = getNodeByIndex(index-1);// index-1索引で見つけたノードはpreNodeとする
preNode.next = insNode;// preNodeノードのポインターは挿入したいノードに指定する
insNode.next = nextNode;// 挿入するノードのポインターはindex索引で見つけたノードのnextNodeとする。
上記の説明はわかりにくいかもしれませんが、次の図を見てください
2.チェーンリストに削除
次のjavaコードは簡単なチェーンリスト作りました。
class Node<T>{
// ノードのデータ
private T data;
// 次のノードを指す(次のノード)
public Node next;
public Node(){};
public Node(T data,Node next){
this.data = data;
this.next = next;
}
public T getData(){
return data;
}
public void setData(T data){
this.data = data;
}
}
class LinkedList<T>{
// 一番目ノード
private Node Head;
// 終端ノード
private Node tail;
// チェーンリストの長さ
private int size;
public int getLength(){
return size;
}
public boolean isEmpty(){
return size == 0;
}
public void clear(){
head = null;
tail = null;
size = 0;
}
public Node getNodeByIndex(int index){
if(index<0 || index>size-1){
throw new IndexOutOfBoundsException("索引は既にリスト範囲を超えてしまいまいsた")
}
Node node = head;
for(int i = 0;i<size; i++,node = node.next){
if(i == index){
return node;
}
}
return null;
}
public void addAtHead(T element){
head = new Node<T>(element,head);
if(tail == null){
tail = head;
}
size++;
}
public void addAtTail(T element){
if(head == null){
head = new Node<T>(element,null);
tail = head;
}else{
Node node = new Node<T>(element,null);
tail.next = node;//ここのindexは挿入する対象の索引ではない、前の対象の索引である。
}
size++;
}
public void insert(T element,int index){
if(index<0 || index>size-1){
throw new IndexOutOfBoundsException("索引は既にリスト範囲を超えてしまいまいsた")
}
if(index == 0){
// 索引は0の場合は、一番名に挿入する
addAtHead(element);
}else if(index>0 && index<size-1){
// 索引は配列の範囲内の場合は
Node nextNode = null;
Node insNode = new Node<T>(element,nextNode);
nextNode = getNodeByIndex(index);
Node preNode = getNodeByIndex(index-1);
preNode.next = insNode;
insNode.next = nextNode;
size++;
}else{
addAtTail(element);
}
}
public void delete(int index){
if(index<0 || index>size-1){
throw new IndexOutOfBoundsException("索引は既にリスト範囲を超えてしまいまいsた")
}
int flag = index-1;
Node node = getNodeByIndex(index);
if(flag<0){
head = head.next;
node = null;
}else{
Node preNode = getNodeByIndex(index-1);
preNode.next = node.next;
if(index == size-1){
tail = preNode;
}
}
size--;
}
public void removeLast(){
delete(size-1);
}
}
ArrayList と LinkedListの区別はなんですか?
ArrayListの中身は配列のため、照会のスピードは速い、インサートのは遅い、(要素を挿入すると、後ろの要素すべて移動される)
LinkedListの中身はチェーリストのため、インサート、削除のスピードは速い、でも照会するのは遅い。
ArrayList と LinkedListはどんな状況でどれを選びますか?
配列の長さが固定の場合は、ArrayListを使う;
インサート、削除の操作が多い場合はLinkedListを使う。
初心者なんですから、間違ったところがあれば、教えてほしいです!!