2017-01-23 11 views
-1

Ich bin ein Anfänger in der Datenstruktur. Ich habe versucht, einen neuen Knoten am Anfang einer verknüpften Liste einzufügen. Aber der Knoten ist überhaupt nicht eingefügt. Das Problem entsteht nur beim Einführen am Anfang. Bitte helfen Sie mir Hier ist mein CodeEinfügen am Anfang in der verketteten Liste

public class singlylinkedlist { 
link head; 
static class link 
{ 
    int data; 
    link nextNode; 
    link(int dat) 
    { 
     data=dat; 
     nextNode=null; 
    } 
} 
public static void insertbegin(link head,int x) 
{ 
    link newnode=new link(x); 
    newnode.nextNode=head; 
    head=newnode; 
} 
static void display(link head) 
{ 
    if(head==null) System.out.println("empty list"); 
    else 
    { 
     link temp=head; 
     while(temp!=null) 
     { 
      System.out.println(temp.data); 
      temp=temp.nextNode; 
     } 
    } 
} 
public static void main(String args[]) 
{ 
    singlylinkedlist link=new singlylinkedlist(); 
    link.head=new link(2); 
    insertbegin(link.head,1); 
    display(link.head); 
    } 
} 

Vielen Dank im Voraus

+0

Da Sie das Rad neu erstellen (nicht sicher, ob dies ein Sprichwort auch in Englisch ist ...), würde ich vermuten, dass dies eine Hausaufgabe ist. Sie sollten also zumindest erklären, was in diesem Code vor sich geht. PS: Willkommen auf SO, siehe [ask] – AxelH

+0

Sie sagen nicht richtig eingefügt, aber Sie sagen nicht, was das Problem ist. Bitte aktualisieren Sie den Beitrag, um genauer zu sein. – Aaron

+1

Tom Verwirrung zu vermeiden, würde ich die "Link" in "singlylinkedlist link" umbenennen, wie Sie eine Klasse und eine Instanz mit dem gleichen Namen haben. –

Antwort

1

Zuerst möchte ich Ihnen dringend raten Klassen zu umbenennen. Java-Klassen sollten immer mit einem Großbuchstaben beginnen (oberer Kamelfall). Und Variablen und Methoden sollten immer niedriger camel case sein (Ausnahme: statische finale Variablen sind oft All-Caps).

Nun zu Ihrer Frage: Ihr Fehler liegt in folgenden: in Ihre Methoden, wenn Sie einen neuen Wert der head Variablen zuweisen, die mit dem Verfahren gegeben wird, diese Änderung wirkt sich nur auf die Variable head, die mit dem Verfahren gegeben ist (nur im Methodenumfang). Wenn Sie die tatsächliche head Variable ändern möchten, müssen Sie den neuen Wert direkt den Klassen head Variable zuweisen.

Je nach Anwendungsfall gibt es drei Lösungen:

  1. Sie müssen mehrere Instanzen Ihrer LinkedList Implementierung:
    • Ändern Sie die Methoden insertBegin und display als nicht statisch.
    • den ersten Parameter der Methoden entfernen, da sie nun die Variable head der Klasse
  2. Sie nur eine Instanz Ihrer LinkedList Implementierung benötigen (nicht wirklich eine gute Lösung) zugreifen:
    • machen sie Ihren Kopf Variable innerhalb der Klasse static
    • den ersten Parameter der Methoden entfernen, da sie nun die Variable head der Klasse zugreifen können
  3. Sie möchten Ihre statische/nicht-statische Muster für die Variablen/Methoden (aus irgendeinem Grund) halten:
    • ändern das Verhalten der head Variable: Es speichert nun nie Ist-Daten, sondern speichert die tatsächlichen Kopf (mit Daten) als seine nextNode Variable.
    • display jetzt liest immer beginnend von head.nextValue
    • insertBegin jetzt nicht den tatsächlichen Kopf Variable überschrieben hat. es hat nur seine nextNode Variable auf den neuen Kopf

einstellen Wenn Sie wollen, ich Ihnen ein Beispiel für einen dieser Fälle geben kann. Ich wollte sie einfach nicht alle aufschreiben und dich selbst herausfinden lassen.


Wenn Sie Ihre Java-Fähigkeiten zu verbessern, würde ich vorschlagen, dass Sie auch für Variablen in die verschiedenen Sichtbarkeitsoptionen suchen und Methoden (privat, protected, public, default)

0

Ihr Code hat eine Menge von Fehlern. Dies ist einfach nicht die Art, wie man eine verknüpfte Liste schreiben würde. Siehe @MichaelRitter 's Antwort und korrigieren Sie sie.

Machen Sie alle Funktionen in singlylinkedlist Klasse nicht statisch, bewegen Sie die link Klasse außerhalb der singlylinkedlist Klasse und schreiben die main() Methode in einer anderen Klasse außerhalb der singlylinkedlist Klasse.

Soweit Ihre insertbegin() Methode betroffen ist, müssen Sie zunächst es nicht statisch machen. Außerdem müssen Sie nur den ganzzahligen Wert im Parameter der Funktion akzeptieren, den Sie am Anfang einfügen möchten. Den Kopfknoten einer verketteten Liste zu nehmen, ist hier nicht sinnvoll. Außerdem müssen Sie überprüfen, ob der Kopfknoten der verknüpften Liste null ist, bevor Sie etwas tun, sonst erhalten Sie eine NullPointerException.

Hier ist eine Arbeitsversion der insertbegin() Methode der singlylinkedlist Klasse:

:

public void insertbegin(int x){ 
    link temp = new link(x); 
    if(head == null) 
     head = temp; 
    else{ 
     link ts = head; 
     head = temp; 
     head.nextNode = ts; 
    } 
} 

Wenn Sie 1 am Anfang des singlylinkedlist link einfügen mögen genannt, können Sie die insertbegin() Funktion als nennen

link.insertbegin(1); 

Ich hoffe, das hilft.

+0

die innere Klasse ist eigentlich in Ordnung. Ich würde es privat tho machen (no1 außerhalb der Linkedlist-Klasse sollte in der Lage sein, die Knoten jemals zu sehen –

Verwandte Themen