2017-12-12 7 views
-1

Ich bin Anfänger in Datenstrukturen Ich konnte das Problem hier nicht erkennen. Mein Code geht während der Anzeige in die Endlosschleife. Ist dies ein richtiger Weg zu implementieren? Kann mir jemand helfen, zu diesem Problem zu kommen? Hier ist mein Code,Implementieren Sie ein doppelt verkettetes Listenprogramm, um zwei Listen an einem bestimmten Element zu verketten?

public void concatLists (Concatenate<E> list2, E ele) 
{ 
    Node<E> temp = header.getNext(); 
    Node<E> temp1 = list2.header.getNext(); 
    Node<E> temp2 = list2.trailer.getPrev(); 
    Node<E> start = header.getNext(); 
    Node<E> end = start; 
    while (temp != trailer) 
    { 
     if (temp.getElement() == ele) 
     { 
      start = temp; 
      end = temp.getNext(); 
     } 
     temp = temp.getNext(); 
    } 
    start.next = temp1; 
    temp2.next = end; 
} 
+0

Fragen, die Debugging-Hilfe suchen ("Warum funktioniert dieser Code nicht?") Müssen das gewünschte Verhalten, ein bestimmtes Problem oder einen Fehler und den kürzesten Code enthalten, der in der Frage selbst reproduziert werden muss. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: Erstellen eines [mcve]. Nutze den Link [Bearbeiten], um deine * Frage * zu verbessern - füge keine weiteren Informationen über Kommentare hinzu. Vielen Dank! – GhostCat

+0

Sie verwenden zwei Dummy-Knoten für Header und Trailer. Daher ein bisschen viel '.next'. Es ist eine gültige Technik, obwohl ich verzichten würde; es ist einfacher IMHO, nur ein "if" beim Einfügen (Kopf oder nächsten zu ändern) benötigt. –

+0

Entschuldigung! Ich habe dich nicht verstanden. Wirst du es weiter erklären? @JoopEggen – wittyButterfly

Antwort

0

Mit zwei Dummy-Knoten ohne Daten (für header resp. trailer) benötigt einige besondere Vorsicht, um sie auszuschließen und ihren nächsten bzw. nehmen. vorh.

Eine wahrscheinlich korrekte Umsetzung würde wie folgt aussehen:

public void insertListAfter(Concatenate<E> list2, E ele) 
{ 
    // header holds a dummy Node 
    // trailer holds a dummy Node 
    if (list2.header.next == list2.trailer) { // list2 empty? 
     return; // Then done 
    } 
    // list2 holds at least one element. 

    // Find the last element to insert after: 
    Node<E> last1 = header.next ; 
    while (last1.next != trailer) 
    { 
     if (last1.element.equals(ele)) 
     { 
      break; 
     } 
     last1 = last1.next; 
    } 

    // Connect at the insertion point begin of second list: 
    Node<E> rest1 = last1.next ; 
    Node<E> first2 = list2.header.next ; 
    last1.next = first2; 
    first2.prev = last1; 

    // Connect the last of the second list with rest of first: 
    Node<E> last2 = list2.trailer.prev; 
    last2.next = rest1; 
    rest1.prev = last2; 

    // Empty list2: 
    list2.header.next = list2.trailer; 
    list2.trailer.prev = list2.header; 
} 

Vergleicht man dies mit der Implementierung, equals scheint wichtig, und auch von Header und Trailer zu kümmern.

Ich würde es versuchen, mit Header und Trailer auf Null initialisiert; es würde den Code vereinfachen; mache es besser lesbar IMHO.

+0

Danke für die Erklärung. Es funktioniert @JoopEggen – wittyButterfly

Verwandte Themen