Eine Liste kopieren

Sandro95

Bekanntes Mitglied
Hey Leute ,

in einer Altklausur habe ich folgende zwei Aufgaben( die verketten von zwei Listen Aufgabe isz kein problem)

1. soll ich eine liste an einer andereren verketten

2. soll ich die Kopien alelr Elemente von liste2 am ende der liste1 anhängen.

könnte man die Aufgabe wie folgt lösen ?




Java:
public void verk(Liste neu) {
        
        if(this.anfang==null) {
            
            this.anfang=neu.anfang;
        }
        else {
            this.ende.nächster=neu.anfang;
            this.ende= neu.ende;
            
        }
    }
    
    public void anhängenKopie(Liste liste2) {
        
        Link a = this.anfang;
        
        while(a!=null) {
            
            this.verk(liste2);
            
            a=a.nächster;
        }
        
        
        
    }


Ich wäre euch mega dankbar wie jegliche Art von hilfe !
 
Spontan so... das muss aber nicht richtig sein:
Java:
    public void verk(Liste neu) {

        if (this.anfang == null) {
            this.anfang = neu.anfang;
        } else {
            this.ende.nächster = neu.anfang;
        }
        this.ende = neu.ende;

    }

    public void anhängenKopie(Liste liste2) {

        Link a = this.ende;
        Link b = liste2.anfang;
        while (b != null) {
            a.nächster = b;
            b = b.nächster;
        }

    }
 
@BestGoalkeeper glaube meine lösung und deine sind beide falsch.. sehe gerade wir verketten lediglich aber erstellen keine kopien...

dachte jetzt an sowas , aber hier kopiert er mir nur das letzte element der ersten liste..

Java:
public void anhängenKopie(Liste liste2) {
        
        Link a = this.anfang;
        
        while(a!=null) {
            
            Link neu= new Link(a.wert,null);
            liste2.add(neu);
            
            this.ende.nächster=neu;
            
            System.out.print(a.wert + " ");
            a=a.nächster;
            
        
            
            
        }

        
        
    }
 
Hat die Liste nicht schon Methoden, um
- am Ende was anzufügen
- durch die Liste zu iterieren?

Wenn dem so wäre, dann würde ich einfach die vorhandenen Methoden nutzen und halt durch die anzuhängende Liste iterieren (was einem die Werte nach und nach gibt) und dann die Werte einfügen (Was dann die neuen Nodes erzeugt).

Das dürfte einfacher zu lesen und hat auch weniger doppelten Code. Sonst hast du ja ständig die gleichen Dinge, wie z.B,. durch die Liste iterieren und so ...
 
Hat die Liste nicht schon Methoden, um
- am Ende was anzufügen
- durch die Liste zu iterieren?
Er hat doch anfang und ende, das Durchlaufen bräuchte er nur zusammen mit dem Erstellen neuer Knoten - und dafür muss es einen Konstruktor oder Ähnliches geben - und dabei hilft dann eine Methode, iterieren, wahrs nicht. 🙁
 
Als erstes musst Du Dir genau überlegen, welche Liste du an welche anfügen willst. Üblich ist, dass die Elemente der übergebenen Liste an die Liste angehängt werden, auf der die Methode aufgerufen wurde.

Und wenn die Methoden nicht vorhanden sind, dann macht es dennoch Sinn, das eben schnell zu implementieren, denn das vereinfacht es doch auch für Dich!

Also brauchst Du sowas wie addAtEnd(wert) als Methode.
Sonderfälle, die Du beachten musst:
a) Liste Leer -> dann kommt die Referenz des neuen Nodes in Anfang.
b) Liste nicht leer -> dann kommt die Referenz nach ende -> naechster.
Und am Ende wird ende = neuer Node.

Dann das Iterieren - das kann man sogar universell machen - also z.B. eine Methode forEach(Consumer<T>) - aber das ist optional.

Iterieren durch eine Liste hast Du ja schon gemacht:

Java:
current = anfang;
while (current != null) {
  // Do somethings (e.g. consumer.accept(current.getValue()))
  current = current.naechster
}

Wenn Du es ohne Consumer machst, dann wäre das natürlich ein addToEnd(current) Aufruf.

Natürlich willst Du die übergebene Liste iterieren - d.h. wenn Du es mit Consumer machst, dann rufst Du liste2.forEach(n -> addToEnd(n)); auf.
Ohne Consumer wird es natürlich ein:
Java:
current = liste2.anfang;
while (current != null) {
  addToEnd(current.getValue());
  current = current.naechster;
}

Also ganz wichtig: Divide and conquer! Teile es in Teilaufgaben auf. Diese sind dann auch deutlich einfacher zu testen, sind übersichtlicher und Code ist deutlich einfacher zu lesen! Das mit dem Consumer ist einfach und gut zu lesen, so man das kennt und beherrscht. Ansonsten wäre halt das Iterator Interface "old school", aber das geht dann wirklich über die Klausur hinaus und ist keine geeignete Lösung für die Klausur.

Aber in der KLausur wären aus meiner Sicht mind. 2 Methoden angebracht: addToEnd und addAll (Oder wie man die immer nennen möchte. add ist eigentlich immer am Ende einfügen, aber man kann da gerne unterscheiden....)
 
Er hat doch anfang und ende, das Durchlaufen bräuchte er nur zusammen mit dem Erstellen neuer Knoten - und dafür muss es einen Konstruktor oder Ähnliches geben - und dabei hilft dann eine Methode, iterieren, wahrs nicht. 🙁
Wir sind doch bei dem Fall, dass er die Liste nicht anhängen will sondern alle Werte einfügen will.
--> Also muss er die Liste mit den einzufügenden Werten durchgehen und dabei
--> Jeden Wert einfügen.
 
Wir sind doch bei dem Fall, dass er die Liste nicht anhängen will sondern alle Werte einfügen will.
--> Also muss er die Liste mit den einzufügenden Werten durchgehen und dabei
--> Jeden Wert einfügen.
Ups, ich habe das falsch verstanden, ich dachte, eine neue Kopie der Liste sollte angehängt werden... Du meinst aber Überschreiben
 
fast die gleichen Methoden soll er doch in der Klausur implementieren 😉
Nein, nicht ganz. Seine Aufgabe ist:
2. soll ich die Kopien alelr Elemente von liste2 am ende der liste1 anhängen.
Das ist erst einmal eine Aufgabe, die genau eine Methode (das addAll) benötigt. Und ist ja auch klar: Genau die Methode muss es geben, denn es wird explizit danach gefragt.

Und mein Tipp ist, auch in der Klausur dies sinnvoll aufzuteilen. Mit etwas Glück kann man eine Methode mehrfach verwenden (hier nicht der Fall) aber auch ohne das, ist es nur unwesentlich etwas mehr Schreibarbeit die einem deutlich mehr Überblick verschafft.

Ups, ich habe das falsch verstanden, ich dachte, eine neue Kopie der Liste sollte angehängt werden... Du meinst aber Überschreiben
Ja, das war die erste Aufgabe. Da ging es nur um da Anhängen. Den Teil hatte er auch erfolgreich absolviert.
 
Genau das habe ich doch beschrieben. Ich habe auf zwei Arten den (pseudo) Code gezeigt, wie es gehen würde ... einmal mit Lambda und co und einmal traditional....
 

Zurück
Oben