2016-04-04 21 views
1

単独でリンクされたリストの最後の要素を削除するアルゴリズムを読んでいます。 私はリンクされたリストオブジェクトと呼ばれるListNodeがあるとします。私は、リストの最後のノードを削除する方法を見出しJavaの単一リンクリストからテールを削除する方法

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

    public ListNode(int data) { 
     this.data = data; 
    } 

    public int getData() { 
     return this.data; 
    } 

    public void setData(int data) { 
     this.data = data; 
    } 

    public ListNode getNext() { 
     return this.next; 
    } 

    public void setNext(ListNode next) { 
     this.next = next; 
    } 
} 

は次のとおりです。すべてがあるので、このコードが動作しているか、私は混乱しています

public ListNode deleteAtTail(ListNode head) { 

    if (head == null || head.next == null) return null; 
    ListNode node = head; 
    while(node.next.next != null) { 
     node = node.next; 
    } 

    node.next = null; 
    return head; 
} 

「ノード」を介して。ただし、リターンヘッドの場合、最後のノードは削除されます。 したがって、私はそれがどのように機能しているのだろうか、それはJavaで「価値に渡される」ことに関連しているのでしょうか?

答えて

4

node.next.nextがnullになるまでリストのnodeを反復処理します。 この時点では、nodeは最後のノードの次のノードを指し、node.nextは最後のノードを指します。 node.nextをnullに設定すると、リストの最後のノードがリストから削除されるため、リストから最後のノードが削除されます。

+0

しかし、すべてが "head"ではなく "node"変数を通過します。だから、変数 "node"の次のノードをnullに設定すると、headの最後の要素は削除されます。 –

+0

'head'はリストの最初のノードを指し、これは第3のノードを指し示す第2のノードを指し、....は最後のノードを指し示す最後のノードの次のものを指す。これらのポインタのいずれかを変更した場合(次のノードのポインタを最後のノードに変更するなど)、リストが変更されます。 – Eran

+0

ありがとう、私はついにそれが起こった理由を知った。 –

1

最後のノードのnextnullになるため、このメソッドは2番目の最後のノードまですべてのノードを反復処理していることがわかります。上記のコード

while(node.next.next != null) { 
    node = node.next; 
} 

秒あなたを与えるだろう、最後のノードとその次がnode.next = null;を使用してnullに設定されているこれは、最後から二番目のノードが現在最後のノードになることを意味します。

0

私はnode.next.nextを持っていて、要素が1つしかないため、NullPointerExceptionを取得するため、私の意見では正解ではないので、私は2セント。

  1. リストは空です:

    は、3つのシナリオがあります。単純に、nullを返したり、そのリストを空にしてください。

  2. リストには1個のアイテムがあります。数えなくてもこれを知ることはできませんが、以下のコードを見てください。
  3. リストには複数の項目があります。リストを通って前のものに一時変数を設定し、最後に到達するとprevious.nextをnullに設定します。

私のアプローチは、最初の以前の変数をnullに設定することです(あなたがリストの先頭より前であると想像してください)。

if(head == null) return; 
    ListNode iterator = head; 
    ListNode prev = null; 
    while(iterator.next !=null) { 
     prev = iterator; 
     iterator=iterator.next; 
    } 
    if(prev == null) head = null; 
    else prev.next = null; 

・ホープ、このことができます:それは1つのアイテムを持っている場合は、whileループでは、それは文句を言わないポイントここ3で行く、他、(それはそれをスキップし、前はnullになります)任意のコマンドを実行すると、コードです。

関連する問題