2010-12-20 14 views
7

リンクリストデータ構造内の最初のノードまたはいわゆるヘッドの性質を理解することに問題があります。リンクされたリストはノードで構成され、各ノードにはデータとリスト内の別のノードへのリンクが含まれます。しかし、最初のノードは、データと2番目のノードへのリンクを含むノードですか?あるいは、それはノードへのリンク(およびデータなし)だけを含んでいますか?私は、リンクされたリストの最初のノードにデータと別のノードへのリンクがあると考えましたが、1つの入門書では、頭はノードですが、最初のノードに移動するリンクです。同時に、headはノードの型の変数です。なぜそれはこのようなものですか? (私はJavaで作業しています。ありがとうございます。リンクリスト内のヘッドノード

答えて

0

いずれにしても実装できます。しかし、データとリンクだけを持つ最初のノードはかなり奇妙な実装になります。

+0

必ずしもそうではありません。 "センチネル"の第0ノードを持つことで、リンクリストに対して多くの操作を簡単に行うことができます。たとえば、多くの操作で空のリストを明示的にチェックする必要がなくなります。 –

+0

あなたは正しいですが、私はそれがあなたが解決している問題に依存していると思います。私は個人的に最初のノードが空のリンクリストを使う必要はありませんでした。 – Falmarri

+0

その実装はjdk6 linkedListのためにあります。 – Anna

0

ヘッドノードは通常、他のノードと似ていますが、論理的にはリストの先頭にあり、他のノードはそれを指していません(二重リンクリストがない限り)。

他のノードがそれを指していないので、リストの開始点を簡単に見つける必要があるので、ヘッドノードを指すノードへの別のポインタを格納するのが一般的です。このポインタはノード自体ではなく、ただ1つのポインタです。

+0

私の本によれば、この別個のポインタは他のノードと同じデータ型を持っています。したがって、それはノード自体ではありませんが、ノードと同じ型を持っています、これは正しいですか? – user42155

+0

それはあなたが書いている言語に依存します。javaのようなものでは、最初のノードへのポインタはおそらくノードでなければなりません。 CやC++のようなものでは、実際のポインタを持つことができます。 – Falmarri

4

これらは「ダミー」ヘッダーノードと呼ばれ、空のリストと空でないリストに対して機能する一般的なコードを記述できます。

通常、リストの最後にNodeを挿入する場合、2つのケースが必要です。 headがヌルで、リストが空であることを示す場合は、headを新しいNodeに設定します。 headがヌルでない場合は、最後にNodeになるまでnextポインタに従い、Nodenextポインターを設定します。

ただし、ダミーヘッダーを使用すると、headは決してnullになりません。 Nodeにはヌルnextポインタがあります。これは新しいNodeを指すことができます。リストにノードが含まれていた場合の表示方法です。

0

これがC++の場合、理解しやすいかもしれませんが、ヘッダーノードは、リスト全体への最初のアクセスを得るための単なる参照です。これは、リストのデータセット内のデータ項目と次のノードへの参照を含む、リスト内の最初の「完全な」ノードを参照します。これがC++の場合、ノードは実際にはコンパイラのメモリアドレスに過ぎないデータ構造の "ポインタ"にすぎません。あなたのリンクされたリストを指しているヘッダーノードがない場合、メモリ内のスペースを占有しながら、再びアクセスされない "エーテル"では失われます。

Javaは、あなたのためにこれを処理するので、実際にはポインタについて心配する必要はありません。しかし、それがあなたの混乱の背後にある理由かもしれません。あまりにも詳細は隠されているので、概念の背後にある知識がなくても、その背後にある理由を知らずに構文規則を受け入れるだけでよいでしょう。

配列はリストの一種で、リンクされたリストもリストの一種です。配列はメモリ内で順番に配置されますが、リンクされたリストは順不同です。配列のメンバはデータ項目のみを参照しますが、メンバはメモリ内に配置されているため、整数値にそのデータ項目のデータ型のサイズを掛けて配列全体の参照に追加するだけでアクセスできます。これは、リンクされたリストが連続した順序で配置されず、したがってリストを構成するために、より複雑なデータ構造、すなわち「ノード」を使用しなければならないという点で、リンクされたリストとは異なる。

しかし、リンクされたリストはメモリ内のどのような順序でも配置されないため、コンパイラはデータのチャンクを別に設定する必要がないため、必要な長さにすることができます長さを変更するたびに新しいものを再作成する必要はありません。配列の長さは静的なので、これは配列とは異なります。さらに、配列はその最初のメンバ、つまり( "a"という名前の配列に対して)参照されます。これは "a [0]"またはこれに相当する "a"です。ただし、リンクされたリストはこのように動作し、全体を参照する「ヘッダー」ノードまたは「ダミー」ノードがある理由です。

ヘッダーノードに関するもう1つの点は、リンクされたリストに対してさまざまな操作を実行する際に、「ヘッドノード」と構造が類似しているノードを作成して、リストの操作を支援することです。

1

ノードは、値を保持する変数「data」と、リンクを作成するために別のNodeオブジェクトを指す別の変数「next」を持つオブジェクトです。 下記のJavaクラスを参照してください。

public class ListNode { 
private int data; 
private ListNode next = null; 

public ListNode() { 
    // TODO Auto-generated constructor stub 
} 
//constructor for creating a listNode 
public ListNode(int data){ 
    this.data = data; 
} 
/*below are setters and getters */ 
public void setData(int data){ 
    this.data = data; 
} 
public int getData(){ 
    return this.data; 
} 
public void setNext(ListNode next){ 
    this.next = next; 
} 
public ListNode getNext(){ 
    return this.next; 
} 
} 

これは私がリンクする方法です。

//create 3 list node objects 
    ListNode one = new ListNode(1); 
    ListNode two = new ListNode(2); 
    ListNode three = new ListNode(3); 

    one.setNext(two); 
    two.setNext(three); 

しかし、我々は、最後にListNodeを追加することから始まるか、リスト内のランダムな場所でのような任意のさらなる操作のためにヘッドノードを知っている必要があります注意してください。

ヘッドノードは、私たちの場合、リストチェーンが開始された場所です。

は、それがクリアされます:)

ホープ@falmarriが答えのおかげ Punith

+0

括弧内の 'ListNode one = new ListNode(1);または' ListNode two = new ListNode(2);の数字 '2 'の数字は何ですか?それは何をするためのものか? – Sam

+0

@Samについては、ListNode(int data)のコンストラクタパラメータを参照してください。データを受け取り、それをオブジェクトデータ変数に割り当てます。 –

1

、あなたはそれをいずれかの方法を実装することができます。ヘッドノードは、単一リンクリストの他のノードと同様です。これは、リンクされたリストの残りの部分をトラバースできる開始ノードに過ぎません。ヘッドをノードまたはポインタのどちらかとして実装できます。

関連する問題