1

Javaでの参照に関する概念的な問題に直面しています。これは私の基本的な実装ですLinkedList

ノード:

class Node {
  int data;
  Node next = null;

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

リスト:

class LinkedList {  
  Node n = null;
  Node start = null;
  int flag = 0;

  void insertion(int x) {
    if(flag==0)
    {   
      Node newnode = new Node(x);
      n = newnode;
      start = newnode;
      flag = 1;
      return;
    }

    Node newnode = new Node(x);
    n.next = newnode;
    n = n.next;
  }

  void deletion() {
    Node str = start;
    while(str.next.next != null)
      str = str.next;
    str.next = null;        
  }

  void printlist() {
    Node str = start;
    while(str != null) {
      System.out.println(str.data);
      str = str.next;
    }
  }
}

テストクラス:

public class Test31 {
  public static void main(String[] args){
    LinkedList ll = new LinkedList();
    ll.insertion(5); 
    ll.insertion(15);
    ll.insertion(25);
    ll.insertion(35);
    ll.insertion(45);
    ll.insertion(55);
    ll.deletion();ll.deletion();
    ll.printlist();
  }
}                       

上記のプログラムは問題なく完全に正常に動作しますが、deletion()このコードに置き換えると次のようになります。

void deletion() {
  Node str = start;
  while(str.next != null)
    str = str.next;
  str = null;       
}

その後、要素の削除は行われません。なぜこれが起こっているのかを知りたいです。トリックを使用str.next.nextしますが、上記の削除方法を使用した場合、whileループをもう1回繰り返すだけでも同じ効果が得られるはずではありませんか?

4

1 に答える 1

3

これは、オブジェクトの 1 つがまだそのstr.nextオブジェクトへの参照を持っている (または参照している可能性startがある) ためです。null に設定strすると、単にそのメソッドのローカル変数nullが に設定str.nextされますが、null に設定すると、そのオブジェクトの参照が削除されstrます。

簡単な例:

Node start = new Node();
Node another = new Node();
start.next = another;
Node toDelete = another;

これを行う場合:

toDelete = null;

この場合、toDeleteは nownullです。start.next最初に割り当てられanotherたオブジェクトへの参照がまだ含まれています。anotherこれを追加しても:

another = null;

この場合、参照が 1 つ残っています。最初に割り当てられstart.nextた元のオブジェクトを引き続き指します。another

最初の削除方法も実際には間違っていると思います。開始ノードを削除することはなく、ノードが 1 つしかない場合はがスローさNullPointerExceptionれ、while ループが に到達しようとしているためです。これはより正確だと思います:start.nextnullstart.next.next

void deletion() {
    Node parent = null;
    Node current = start;
    while (current.next != null) {
        parent = current;
        current = current.next;
    }
    if (parent == null) {
        start = null;
        flag = 0;
    } else {
        parent.next = null;
        n = parent;
    }    
}
于 2013-01-15T19:00:29.803 に答える