Javaのアルゴリズム - 単独リンクリスト

方法は、リストの連結
鎖からなる線形リストであり、ノードが実際に(ノード)であるようにリンクされたリストのノードの可変数を有します。不連続なメモリに格納されたデータは、各ノードが唯一の次のノードのそれだけ格納位置ことを知って、メモリ内の格納されたデータを分散させました。単独でリンクされたリストからなるNのノード(ノード)ここで、各ノードのノードデータと現在の記録次のノード。唯一のヘッドノード(ヘッド)外部に露出、我々はすべての操作は、そのヘッドノードを介して直接的または間接的に行われているリスト。

リストと配列の違い

これは、配列の特徴

  • メモリアレイ内の連続した領域です。
  • アレイは、最初の会計アプリケーションのメモリサイズを使用する前に、メモリスペースを無駄にすることができる、予備のスペースが必要です。
  • 挿入、削除データのデータの非効率性は、ときにデータを挿入し、位置データは、メモリ内の後方に、この動きの背後にします。いつ削除データ、データの背後にあるデータは、前方に移動する必要があります。
  • 高いランダムリード効率。配列は連続しているので、我々は、各データのメモリアドレスが直接データに対処するために見つけることができます知っています。
  • 配列定義は、十分なスペースでないときに配列を再定義します。

機能一覧

  • それは継続的な必要としない、メモリ内の任意の場所があるかもしれません。
  • 各データは、このアドレスを介して次のデータを見つけるために、次のデータのメモリアドレスを格納しています。
  • 簡単にデータ、削除データを増加させました。あなただけがデータを移動する必要はありません、ラインにアドレスポイントを変更する必要があります。
  • 彼らはランダムアクセス性を持っていないので、効率が低いデータを検索し、場所へのデータアクセスは、第1〜第データに保存されている次のデータのアドレスを見つけるために、第1および第2のデータからのアクセスデータを開始しなければなりません前後。
  • 簡単に拡張のためにサイズを指定しないでください。リストのサイズを定義することなく、データが追加または削除されます。

リンクリストと配列のを選択します

増加よりもより多くの配列を持つマルチクエリは、リンクリストを削除します。

次のように一本鎖コードのJava実装は、次のとおりです。


class node{        //节点
    int  data; //数据
    node next; //用来指向下一个地址  模仿指针
    public node(){}
    public node(int  data){
        this.data = data;
    }
}

public class aa {

    public static void main(String[] args) {

         node head = null;  //创建头节点
         node  t = null;  //创建头节点
         node n1 = new node(2); //创建其它节点并输入数据
        //创建第一个节点时 next置空
         n1.next = null;
         node n2 = new node(4);
         node n3 = new node(6);
        List<node> list = new ArrayList();
        list.add(n1);
        list.add(n2);
        list.add(n3);
        int i ;
        /*
        //给链表中添加数据   尾插法
        for( i = 0; i<list.size();i++){
            if(head == null){
                head= list.get(0);
            }else{
                list.get(i-1).next = list.get(i); //如果不是头节点则将上一个节点的next指向此节点地址
            }
            head = list.get(0);  //将头节点指向第一个节点
        }
*/

        //给链表中添加数据   头插法
        for( i = 0; i<list.size();i++){
            if(head == null){
                head = list.get(0); //把第一个节点赋值给头节点
            }else{
                list.get(i).next = list.get(i-1);  //如果不是头节点则将此节点的next指向上一个节点地址
            }
            head = list.get(i);   //把此节点的地址赋值给头节点
        }

        t = head; //从链表头部开始遍历
        System.out.print("原始的数据:");
        while (t!=null){   //如果头节点的next值不为空则输出头节点指向的地址数据
            System.out.print(t.data);
            t = t.next;   //指向下一个节点
        }

        //增加节点
        node n4 = new node(5);
        t = head;
        while (t!=null){   //如果头节点的next值不为空则输出头节点指向的地址数据
            if(t.data<n4.data){  //如果第一个节点小于添加的节点,则把第一个节点添加到该节点的next
                n4.next = t;
                head = n4; //另该节点为开始节点
            }
            if(t == null || t.next.data < n4.data) {  //如果该节点的下一个节点的值小于待插入数据时插入数据
               n4.next = t.next;  //把该节点的指向的下一个节点赋值给添加节点指向的下一个节点
               t.next = n4;  //把添加节点设置为该节点指向的节点
                break;
            }
            t = t.next; //指向下一个节点
        }
        System.out.println();
        System.out.print("添加数据5:");
        t = head;
        while (t!=null){   //如果头节点的next值不为空则输出头节点指向的地址数据
            System.out.print(t.data);
            t = t.next;   //指向下一个节点
        }

        //删除节点n4节点也就是值为4的节点
        t = head;
        while (t!=null){   //如果头节点的next值不为空则输出头节点指向的地址数据
            if(t.next.data == 5) {  //如果下一个节点的值等于待删除数据时删除
               t.next = t.next.next;  //删除数据
               break;
            }
            head = head.next; //指向下一个节点
        }
        System.out.println();
        System.out.print("删除数据5:");
        t = head;
        while (t!=null){   //如果头节点的next值不为空则输出头节点指向的地址数据
            System.out.print(t.data);
            t = t.next;   //指向下一个节点
        }

    }
}

結果は以下の通り:
ここに画像を挿入説明

公開された34元の記事 ウォン称賛11 ビュー8989

おすすめ

転載: blog.csdn.net/qq_37909141/article/details/102817532