方法は、リストの連結
鎖からなる線形リストであり、ノードが実際に(ノード)であるようにリンクされたリストのノードの可変数を有します。不連続なメモリに格納されたデータは、各ノードが唯一の次のノードのそれだけ格納位置ことを知って、メモリ内の格納されたデータを分散させました。単独でリンクされたリストからなる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; //指向下一个节点
}
}
}
結果は以下の通り: