単一のリストとは何ですか
単一のリストを見て前に、あなたはリストが何であるかを知っているのですか?あなたがリストであるかわからない場合は、<私のブログの記事をチェックアウトすることができ、リスト-LinkList >
単独リンクリストは、リストの基本的な構造の一つです。図に示す単純なノード構成。、単一のリストを構成するノードの基本的な構造です。データ要素、同一の構成を有するノードを指し示すための次のポインタフィールドを格納するノードデータフィールドに。
単鎖としても知られている唯一のノードポインタからです。
シングルリンクリスト明確に3つの概念を区別する必要があります。つまり、先頭ポインタ、ヘッドノードと第1ノード要素。
最初のノード、ヘッドポインタと第1ノード元(段落はダニエルさんのブログ@ciyeer切り替え)
- 最初のノードは:時々、このノードが呼び出されたノードのリストの余分な添加の最初のノードの前に、ノード・データ・フィールドは、一般的にデータが格納されていない(またはいくつかのケースでは、そのようなリストの長さなどの情報を格納することができます)最初のノードのために。
ヘッドノード・ポインタ・フィールドは、(NULL)が空である場合、それはリストが空であることを示しています。リストのヘッドノードは、それが特定の問題に対処するには、最初のノードは、問題をより簡単にリストに追加され、必要ありません。
第一要素ノード:リンクされたリスト要素が配置されているの最初のノードは、最初のノードの後ろの最初のノードです。
ヘッド・ポインタは:(最初のノードが最初のノードにリスト先頭ポインタを持っている場合、そうでない場合、最初の要素ノードへのヘッド・ポインタ)は、常にリスト内の最初のノードの位置を指します。
第1のノードとヘッドポインタとの差:ヘッド・ポインタは、リストまたはノードの最初の要素のヘッドノードへの最初のポインタのポインタであり、最初のノードが実際に存在するノードであり、データ・フィールド・ポインタ・フィールドを含みます。直接プログラムに反映さの両方をすることである:ヘッド・ポインタのみ記憶領域を割り当てる宣言せずに、最初のノードが宣言され、ノードに割り当てられた実際の物理メモリされています。
ではなくヘッドポインタなしで、単一リンクリストのヘッドノードが存在しない場合があります!
同じ鎖上のヘッドノードを導入することをさらに説明することなく、コードをよりコンパクトになり、その他の要素と最初の要素を挿入および除去することができます。
単一リンクリストの基本的な操作
単一リンクリストの基本的な操作は以下のとおりです(追加)追加、削除(削除)、変更(設定)、チェック(見つける)、挿入(挿入)などが挙げられます。
ここでは、ソースコードを見て他の実装、のみ、追加、削除、3つの操作を挿入について説明します。
単一のリストには、要素を追加します
テール・ノードの新しいノードとして新しいノードを宣言し、次= NULL;
元のリスト内の最後のノードを取得し、それが新しいノードノード1の次の段階を指します
可変長レコードリスト1
単一のリスト要素を削除するには
あなたはノードのノードを削除するノード上で入手
次の次の次のノードにノード点
次のノードは、ノードポインタでないので、自動洗浄システムになるため
可変長レコードリスト-1
単独リンクリスト挿入要素
挿入するノード位置を得ます。
ステップ1で得られたノードに新しいノードのノード点を宣言する。
ノードが必要と挿入のノードの位置を求めます。
新しいノードのノードへの次のステップ3を得ノード。
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);
}
}
}