javaのチェーンリスト(鎖表)「链表」(基本)_JP

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を使う。

初心者なんですから、間違ったところがあれば、教えてほしいです!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值