web-dev-qa-db-ja.com

リンクされたリストの「頭」とは何ですか?

私はJavaのリンクリストで作業しているので、単一のリンクリストの概念を理解しようとしています。

head -> 12 -> 34 -> 56 -> null

head.nextは12になります(node1と同じ)。しかし、その時の頭は何ですか?

更新:参照とポインタの違いは何ですか?

Update2:したがって、head12およびhead.next34、それでは、この次の関数は最初のノードをスキップしてnullかどうかを確認することを意味していませんか?

public void add(Object data, int index)
    // post: inserts the specified element at the specified position in this list.
    {
        Node temp = new Node(data);
        Node current = head;
        // crawl to the requested index or the last element in the list,
        // whichever comes first
        for(int i = 1; i < index && current.getNext() != null; i++)
        {
            current = current.getNext();
        }
        // set the new node's next-node reference to this node's next-node reference
        temp.setNext(current.getNext());
        // now set this node's next-node reference to the new node
        current.setNext(temp);
        listCount++;// increment the number of elements variable
    }

ソース: http://www.mycstutorials.com/articles/data_structures/linkedlists

15
Strawberry

リストの先頭は、リストの最初のノードを指します。そのノードの参照を格納する変数に適切な名前を付け、リストが空の場合はnull参照が含まれることを期待します

someLinkedList.head
         |
         |
         v
        ______        ______        ______            
       |    |n|      |    |n|      |    |n|           
       |    |e|      |    |e|      |    |e|           
       | 12 |x| -->  | 34 |x| -->  | 56 |x| --> null
       |    |t|      |    |t|      |    |t|           
       |____|_|      |____|_|      |____|_|           

コンテキストに応じて、尾は異なるものを参照できます。私が慣れている用語は、この例では、尾が34 -> 56 -> null、つまり、頭に続くリストに対応するということです。

他のコンテキストでは、最後のノードへの参照である場合があります。このような解釈では、テールは例の56ノードを参照します。


あなたの最初の編集について、それはたまたま完全に異なる質問です:

ポインタはメモリアドレスに対応する値です。参照は、あるオブジェクト(またはnull)を参照する値です。 Java参照でポインタ演算を行うことはできませんが、それ以外はかなり似ています。

あなたを混乱させる可能性があるのは、Javaの変数がオブジェクトを含むことは決してないことができないということです。オブジェクトは常にヒープ上に存在し、変数には、プリミティブデータ型、またはヒープ上のオブジェクトへの参照が含まれます。


2番目の編集について:

あなたが提供した例では、addメソッドは最初の要素をスキップするように見え、ある意味ではスキップします。これは、実装にヘッドとして「ダミー」要素があるためです。コンストラクターのヘッド変数の初期化を見てください。

head = new Node(null);

彼らがそうすることに決めた理由がわかりません。私にはそれは明白な愚かに見えます。

26
aioobe

「頭」という用語には、まったく無関係の2つの意味があります。最も一般的なものは(LISPから出てくると思います)、「リストの最初の要素」です。あなたの図から判断すると、それはあなたが考えている意味ではありません。

2番目の意味は、次の問題に対処するための手法を指します。リンクされたリストをデータのあるノードとして表す場合、リストが空の場合、リストへのすべての参照(および/または言語に応じたポインター)何も指すものがないため、nullにする必要があります。これにより、リストを使用するコードに多くの簿記問題が発生します。 list headはこの問題を解決します。これは、実際のデータを含まないリストノードです。リストへの参照またはポインターは、常にヘッドノードへのポインターです。リストの最初の要素は常にhead.next。通常、「ヘッド付きリンクリスト」を実装するクラスには、ヘッドの存在が隠されています。

サポートされている操作によっては、リストの最後に、特に二重にリンクされたリストの場合に同様の簿記問題が発生する可能性があります。 list tailノードは簿記を簡素化します。

これらは、文献では「センチネルノード」とも呼ばれます(リンクリストの Wikipedia記事 を含む)。

6
Ted Hopp

はい、それは最初のノードへのポインタです

4
Tbone

何よりもまず、ヘッドは独立したノードではなく、最初のノードへの参照にすぎないことに注意してください。最初のノードへのポインタを格納することにより、リスト全体を保持します。

別の注目すべき違いは、ヘッドがスタックに格納される通常のローカルポインター変数であるのに対し、リストノードはヒープに格納されることですSo Inほとんどの専門用語Headは、リンクリストの最初の要素への参照を保持する単なるローカルポインタであり、空のリンクリストを区別するために、ほとんどがNULLで初期化されます。

2
Varun Garg