単独リンクリストを(Javaが達成します)

単一のリストとは何ですか

単一のリストを見て前に、あなたはリストが何であるかを知っているのですか?あなたがリストであるかわからない場合は、<私のブログの記事をチェックアウトすることができ、リスト-LinkList >

単独リンクリストは、リストの基本的な構造の一つです。図に示す単純なノード構成。、単一のリストを構成するノードの基本的な構造です。データ要素、同一の構成を有するノードを指し示すための次のポインタフィールドを格納するノードデータフィールドに。
単鎖としても知られている唯一のノードポインタからです。

シングルリンクリスト明確に3つの概念を区別する必要があります。つまり、先頭ポインタ、ヘッドノードと第1ノード要素。

最初のノード、ヘッドポインタと第1ノード元(段落はダニエルさんのブログ@ciyeer切り替え)
  • 最初のノードは:時々、このノードが呼び出されたノードのリストの余分な添加の最初のノードの前に、ノード・データ・フィールドは、一般的にデータが格納されていない(またはいくつかのケースでは、そのようなリストの長さなどの情報を格納することができます)最初のノードのために。

ヘッドノード・ポインタ・フィールドは、(NULL)が空である場合、それはリストが空であることを示しています。リストのヘッドノードは、それが特定の問題に対処するには、最初のノードは、問題をより簡単にリストに追加され、必要ありません。
第一要素ノード:リンクされたリスト要素が配置されているの最初のノードは、最初のノードの後ろの最初のノードです。

  • ヘッド・ポインタは:(最初のノードが最初のノードにリスト先頭ポインタを持っている場合、そうでない場合、最初の要素ノードへのヘッド・ポインタ)は、常にリスト内の最初のノードの位置を指します。

  • 第1のノードとヘッドポインタとの差:ヘッド・ポインタは、リストまたはノードの最初の要素のヘッドノードへの最初のポインタのポインタであり、最初のノードが実際に存在するノードであり、データ・フィールド・ポインタ・フィールドを含みます。直接プログラムに反映さの両方をすることである:ヘッド・ポインタのみ記憶領域を割り当てる宣言せずに、最初のノードが宣言され、ノードに割り当てられた実際の物理メモリされています。

ではなくヘッドポインタなしで、単一リンクリストのヘッドノードが存在しない場合があります!
同じ鎖上のヘッドノードを導入することをさらに説明することなく、コードをよりコンパクトになり、その他の要素と最初の要素を挿入および除去することができます。

単一リンクリストの基本的な操作

単一リンクリストの基本的な操作は以下のとおりです(追加)追加、削除(削除)、変更(設定)、チェック(見つける)、挿入(挿入)などが挙げられます。

ここでは、ソースコードを見て他の実装、のみ、追加、削除、3つの操作を挿入について説明します。

単一のリストには、要素を追加します
  1. テール・ノードの新しいノードとして新しいノードを宣言し、次= NULL;

  2. 元のリスト内の最後のノードを取得し、それが新しいノードノード1の次の段階を指します

  3. 可変長レコードリスト1

単一のリスト要素を削除するには
  1. あなたはノードのノードを削除するノード上で入手

  2. 次の次の次のノードにノード点

  3. 次のノードは、ノードポインタでないので、自動洗浄システムになるため

  4. 可変長レコードリスト-1

単独リンクリスト挿入要素
  1. 挿入するノード位置を得ます。

  2. ステップ1で得られたノードに新しいノードのノード点を宣言する。

  3. ノードが必要と挿入のノードの位置を求めます。

  4. 新しいノードのノードへの次のステップ3を得ノード。

  5. 1本鎖可変レコード長。


ソース実装(Javaの)

/*
结点
 */
public class Node<AnyType> {
    public  AnyType data;
    public  Node<AnyType> next;
    public Node(AnyType data,Node<AnyType> next){
        this.data=data;
        this.next=next;
    }
}

-----
public class MyLinkList<AnyType> {

    //首元节点
    private Node<AnyType> first;

    //头指针
    private Node<AnyType> head;

    //链表长度
    int thesize;

    //初始化链表
    public boolean initlist(){
        thesize=0;
        first=new Node<>(null,null);
        head=new Node<>(null,first);
        return true;
    }

    //判断链表是否为空
    public boolean isEmpty(){
        return thesize==0;
    }

    //获取节点
    public Node<AnyType> getNode(int i){
        Node<AnyType> renode=head;
        for(int j=-2;j<i;j++){
            renode=renode.next;
        }
        return renode;
    }

    //在末尾添加元素
    public void add(AnyType a){
        Node<AnyType> renode=new Node<>(a,null);
        getNode(thesize-1).next=renode;
        thesize++;
    }

    //删除i位置节点,并返回删掉的数据
    public AnyType remove(int i){
        if(i==thesize-1){
            AnyType a=getNode(thesize-1).data;
            getNode(thesize-2).next=null;
            return a;
        }
        Node<AnyType> prev=getNode(i-1);
        AnyType a=prev.next.data;
        prev.next=prev.next.next;
        thesize--;
        return  a;
    }

    //在i位置插入新节点
    public void insert(int i,AnyType a){
        Node<AnyType> prev=getNode(i-1);
        Node<AnyType> renode=new Node<>(a,prev.next);
        prev.next=renode;
        thesize++;
    }

    //获取i位置节点的数据
    public AnyType get(int i){
        return getNode(i).data;
    }

    //为i位置元素重新赋值
    public void set(int i,AnyType a){
        getNode(i).data=a;
    }

    //返回链表节点个数
    public int length(){
        return thesize;
    }

    //清空链表
    public void clear(){
        initlist();
    }

    //打印链表
    public void print(){
        for(int i=0;i<thesize;i++){
            System.out.println(getNode(i).data);
        }
    }

}

おすすめ

転載: www.cnblogs.com/sang-bit/p/11609824.html