0

私はJavaの初心者ですが、複雑なため、Javaのリンクリストを理解できません。だから私のコードはとてもシンプルです。

Node node, head, tail;
head = null; // initializes the head of the linked list to null
int counter = 0;

String inputdata; // input


do
        {
            System.out.print ("What name would you like stored? (\"quit\" to end) ");
            inputdata = stdin.readLine ();


            if (!inputdata.equals ("quit"))
            {
                node = new Node (inputdata);
                node.next = head;

                // update the head to point to the new front of the list
                head = node;
                count++;
            }
        }
        while (!inputdata.equals ("quit"));  // loop continues until "quit" selected


        System.out.println ();
        node = head;



///////////////////////////////
  String delete;
  boolean found;
  System.out.println ("What node to delete?");
  delete = stdin.readLine ();

 do
        {
            for (int i = 0 ; i <= count ; i++)
            {

                if (delete.equals (node.data))
                {
                    found = true;
                    System.out.println ("It is found!");

                }
            }
        }
        while (found = false);

これはクラスです

public class Node
{
    Node next;
    String data;

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

アルゴリズムがどのように機能するかを理解しています。ノードが検索され、見つかった場合、そのノードの前のノードが検索されたノードの後のノードを指します。

ここに画像の説明を入力してください

ノードを検索するたびに、java.lang.nullpointer例外が発生します。これは、基本的にコードに変換されますが、ひどいものです。

これを行う方法を検索するときはいつでも、「なぜこれを置くのか」、「LSとは何か」、「なぜ複数のメソッドがあり、その中の変数nはいくつあるのか」と自問するので、助けが必要です。

私が間違っていることと私がしなければならないことを教えてください。

4

1 に答える 1

0
 node = new Node (inputdata);
            node.next = head;

            // update the head to point to the new front of the list
            head = node;
            count++;

最初にノードを作成し、次にこのノードの次のノードがヘッドであると言います...そして、ヘッドがこのノードであると言います...したがって、基本的にヘッド==ノード==ノードを作成しています。次

それはしません:D

私はこれを提案します:

    //Init head and tail...
if(head==null){
 head = new Node("Head"); //use whatever data you want/need
 tail= new Node("Tail");
 tail.next=head;
 head.next = tail;
}

//add a new node...
newnode = new Node("Some data");
//since this is a one-way linked list, i suggest you walk from the head
//and go until you meet the tail
currNode = head;
while( currNode.next.data.compareTo("Tail") != 0 )
{
   currNode = currNode.next;
}
//now add the new node here...
newnode.next = currNode.next;
currNode.next = newNode;

このようにして、常にリストの「最後」に追加します...最初に追加したい場合は、頭の直後にこれを使用します:

    newNode = new Node("Some data");
    newNode.next = head.next;
    head.next = newNode;

リストの最後にいるときに知るために、尻尾のような「リミッター」を持っていることをお勧めします...

これで、削除が機能するはずですが、さらにいくつかのことをお勧めします。

currentNode = head;
do
    {
        if(currentNode.next.data.compareTo(delete)==0){ //if the next one is the one i'm looking for, remove it and let the garbage collector take care of it
           currentNode.next = currentNode.next.next;
           break; //leave the loop
        else
          currentNode = currentNode.next;
    }
    while (currentNode.next.data.compareTo("Tail") != 0);

このwhileループを使用すると、リストを最後/最後までトラバースし、見つからない場合は停止します...あなたの例では、検索されたノードが見つからなかったため、リストを何度も繰り返します

于 2013-07-26T08:00:08.727 に答える