Algorithmus Datensätze einfügen wenn...

SelinaHuber

Mitglied
Hallo. Ich habe eine Aufgabe und komm da gar nicht weiter:
1. Algorithmus entwickeln: boolean insert (Object prev, Object data), der neuen Datensatz hinter dem prev einfügvt.
2. Wenn prev nicht in der Liste ist, soll der neue DS auch nicht eingefügt werden.
3. boolean sollte true sein, wenn erfolgreich eingefügt wurde. false, wenn nicht eingefügt wurde.
 

SelinaHuber

Mitglied
Java:
    public boolean insert(Object prev, Object data) {
        for (Node node = this.head; node != null; node = node.next) {
            if (node.data == prev) {
                node.next = new Node(data, node.next);
                return true;
            }
        }
        return false;
        
    }
doch hab was :D das hab ich aber es funktioniert nicht.
 
M

Mart

Gast
Java:
      public void insert(Node n)
      {
          Node n=head;
          while( n.next !=null )
          {
              if(// nächste ist dein node vor dem du einfügen willst//) {
                break;
              }
              n=n.next;
          }
        // ist für eine Liste wo der Header am anfang als Node(null, null ) hat
          n.next=new Node(name,n.next);
      }

du gehst die schleife deiner liste nicht richtig durch und der vergleich ist auch nicht nicer dicer
da jedes Objekt von der Klasse Object erbt und die die methode equals hat solltest du da mal gucken


und deine For schleife ist sehr verwirrend... mit der While schleife gehts einfacher



dein Previous knoten ist der in dem du dich befindest und dein next knoten ist aktuellerKnoten.next



bei meinem musst halt noch viel rum bastelnl
 
Zuletzt bearbeitet von einem Moderator:

SelinaHuber

Mitglied
Java:
      public void insert(Node n)
      {
          Node n=head;
          while( n.next !=null )
          {
              if(// nächste ist dein node vor dem du einfügen willst//) {
                break;
              }
              n=n.next;
          }
        // ist für eine Liste wo der Header am anfang als Node(null, null ) hat
          n.next=new Node(name,n.next);
      }

du gehst die schleife deiner liste nicht richtig durch und der vergleich ist auch nicht nicer dicer
da jedes Objekt von der Klasse Object erbt und die die methode equals hat solltest du da mal gucken


und deine For schleife ist sehr verwirrend... mit der While schleife gehts einfacher



dein Previous knoten ist der in dem du dich befindest und dein next knoten ist aktuellerKnoten.next



bei meinem musst halt noch viel rum bastelnl
ah ok verstehe! danke dir mal. ich werds versuchen:)
 
M

Mart

Gast
du brauchst halt
methode ( vorgänger , einfüg knoten)
if current knoten equals vorgänger break;
n auf next wechseln

falls next null ist return false
else einfügen und return true
 
K

kneitzel

Gast
du gehst die schleife deiner liste nicht richtig durch
Das ist so nicht korrekt! Ich würde eher sagen, dass Du nicht richtig durchgehst.

Erst einmal ist die for schleife vom TE ja:

Java:
for (Node node = this.head; node != null; node = node.next) {

Und das ist 1:1 umschreibbar zu einer While Schleife:
Java:
Node node = this.head;
while (node != null) {
    // Schleifeninhalt
    node = node.next;
}

Das ist also durchaus die korrekte Schleife. Deine Schleife ist aber definitiv nicht korrekt:
Java:
          Node n=head;
          while( n.next !=null ) {
              // ...
          }
Wenn head null ist (List hat keine Elemente), dann hast Du hier eine NullPointerException!

Die for Schleife ist in meinen Augen auch die traditionelle Zähl-Schleife und daher würde ich den Code auch nicht mit so einer for Schleife schreiben, aber das ändert nichts daran, dass die Schleife so erst einmal korrekt ist!
 
M

Mart

Gast
man hat da keine null pointer exception, kannst dubitte erklären wo die passieren kann?
#
Mein head is Node(null,null);

head.next ist null -> while schleife wird übersprungen
node wird hinter head eingefügt
head pointer auf den neuen node und der neue node hat als next wert null

sieh dir mal die Liste mit Pseudo Head Knoten an
 
Zuletzt bearbeitet von einem Moderator:
M

Mart

Gast
Java:
public class Main {
public static void main(String[] args) {
    LinkedsList list = new LinkedsList();
    list.insert(2);
    list.insert(3);
    list.insert(0);
    list.insert(7);
    list.insert(9);
    list.readList();
}
}
class LinkedsList{
          Node head;
          public LinkedsList() {
              head = new Node (null,null);
          }
          public void insert(int value )
          {

              Node n=head;
              while( n.next !=null )
              {
                  if(n.next.counter>=value) break;
                  n=n.next;
              }
              n.next=new Node(value,n.next);
          }
       
          public void readList() {
              Node n=head;
              while( n.next !=null )
              {
                  System.out.println(n.next.counter);
                  n= n.next;
              }
          }
          private class Node
          {
              Integer counter;
              Node next;
            public Node(Integer counter ,Node n) {
              this.counter = counter;
                next = n;
            }
          }
        }

Probiers selber aus und dann gib mir recht :cool:

ich warte 😁


(es sind keine Imports nötig für das nicht dass du denkst ich hab da ne linked list importiert )
 

MoxxiManagarm

Top Contributor
Ja bei dir ist das schon so, aber eine LinkedList wird normaler Weise nicht mit einem leeren Node initialisiert. Das ist halt eine LinkedList mit einem leeren Node, aber nicht eine leere List.
 
M

Mart

Gast
Ja bei dir ist das schon so, aber eine LinkedList wird normaler Weise nicht mit einem leeren Node initialisiert. Das ist halt eine LinkedList mit einem leeren Node, aber nicht eine leere List.
es gibt viele Verschiedene Methoden eine Liste zu initialisieren
1. array Liste
2. mit null als head und ende
3. mit pseudo Node
usw udn sofort

ich habe einen pseudo node benutzt und es funktioniert einwandfrei falls du die liste ohne inserts ausgibst kommt auch kein Fehler weil sie "leer" ist weil der header nur den anfang der liste repräsentiert und der null pointer vom head wird immer weiter geschoben und repärsentiert das ende

Dass eine Liste von ANfang an KOMPLETT ohne alles da stehen muss hat niemand gesagt hilfsmittel kann ich ja einbauen der head ist ja das problem der liste und ist nach aussen hin auch nicht sichtbar oder hat einen effekt ob ich es mit head mach oder ohne es geht darum sachen einzufügen oder sonst was zu machen und solange das richtig ist sollte es auch kein problem darstellen
 

MoxxiManagarm

Top Contributor
3. mit pseudo Node

Das ist Schmarn. Wie willst du einen Pseudo Node von einem Node unterscheiden, der tatsächlich keinen Wert hat.
Stell dir vor du hast einen Karawanenführer von Kamelen. Hat er kein Kamel so ist seine Karawane leer, er hat keinen Zügel in der Hand (head). Das ist doch nicht das gleiche wie eine Karawane bestehend aus einem Kamel, welches aber nichts trägt.
Bitte, wer auch immer dir die Idee von dem Pseudo Node in den Kopf gepflanzt hat, streiche sie wieder.
 
M

Mart

Gast
du verstehst nicht was ich mit dem pseudo knoten erreiche...

wenn du schon dieses Beispiel haben willst
dann insert(1)
also 1 kamel hast
und du gibst dir alle listen elemente aus wie viele hast du dann?
auch nur 1 in der Ausgabe
 

MoxxiManagarm

Top Contributor
Es geht mir nicht darum was du in der Ausgabe siehst, sondern was du physisch hast.

Wenn du mit dem Kamel beginnst, welches nicht trägst hast du immernoch eine Karawane der Länge 1. Dieses Kamel beim Zählen und beim Betrachten (Ausgabe) zu ignorieren ist nur eine Verschleierung dessen.

Das ist darüber hinaus, wärest du im Berufsleben, für andere kaum nachvollziehbar und sehr fehleranfällig.
 
K

kneitzel

Gast
Ich würde es einfach einmal so nachfragen:
Wo siehst Du den Vorteil eines solchen Dummy Nodes?

Er erhöht auf jeden Fall die Komplexität bei allen Operationen und macht Code schlechter lesbar.
Als Beispiel reicht ja schon diese Methode als Beispiel:
Java:
          public void readList() {
              Node n=head;
              while( n.next !=null )
              {
                  System.out.println(n.next.counter);
                  n= n.next;
              }
          }
Das Objekt in n interessiert nicht. Es interessiert eigentlich nur n.next.

Oder eine andere Argumentation:
Generell könntest Du auch den Code überall umschreiben. Da head nur auf einen Dummy-Node verweist, in dem immer nur next gesetzt oder verwendet wird, könntest Du überall statt auf Head direkt auf head.next zugreifen.

Also aus der Methode oben würde man dann so erhalten:
Java:
          public void readList() {
              Node n=head.next;
              while( n !=null )
              {
                  System.out.println(n.counter);
                  n= n.next;
              }
          }

Aber vielleicht übersehe ich ja irgend einen Grund, etwas so zu bauen?

Und falls Du in einem Kurs mit dem TE bist, dann kann sowas in der Art sogar Teil der Aufgabe sein. Selbst das möchte ich nicht ausschließen. Ich habe schon genug gesehen, so dass ich etwas in der Art nicht ausschließen würde.
 
G

Gelöschtes Mitglied 65838

Gast
Ich steh in keiner beziehung mit dem TE

der hauptgrund war für den Dummy Node

Eine "normale" Liste hat als head einen Node auf den ein Null pointer zielt als vorgägner und der musste immer im nachhinein umgeändert werden ( so hatte ich es gelernt ka ob das schon grampf war)
durch den Dummy fällt das Umlenken des Endes und des Anfangs weg weil der Dummy Knoten schon die Information des Anfangs (Das Objekt ist null und kann nicht mehr in der Liste vorkommen..falls ich es mit generics gesichert hätte) und das ende ist auch schon dabei weil head.next = null einfach weiter gegeben wird an den Node der das Ende macht


KA Ob das Überzeugend ist oder Schwachsinnig nur so hatte ich es gelernt... man macht ja immer alles den alten nach :cool:


und die Verbesserung mit n=head.next find ich sehr gut muss ich gleich übernehmen :D
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Ich steh in keiner beziehung mit dem TE
Du bist auch Mart? Also zwei Accounts? Weil auf Mart bezogen wir uns ja.
Eine "normale" Liste hat als head einen Node auf den ein Null pointer zielt als vorgägner und der musste immer im nachhinein umgeändert ( so hatte ich es gelernt ka ob das schon grampf war)
durch den Dummy fällt das Umlenken des Endes und des Anfangs weg weil der Dummy Knoten schon die Information des Anfangs (Das Objekt ist null und kann nicht mehr in der Liste vorkommen..falls ich es mit generics gesichert hätte) und das ende ist auch schon dabei weil head.next = null einfach weiter gegeben wird an den Node der das Ende macht
Generell hast Du eine Referenz zu ändern, wenn der head sich ändert. Nur einmal ist das head und mit Dummy-Knoten ist s next im Dummy-Knoten.

Man könnte jetzt maximal überlegen, ob es die Sonderfälle reduziert, dadurch dass ich den head als normalen Node verändern kann. Es kann also den Code bei den Sonderfällen schöner machen. Also was man nicht mehr braucht ist sowas wie:
Java:
Node newNode = new Node(.....);
if (head == null) {
    head = newNode;
} else {
    getLastNode().next = newNode;
}

So etwas könnte dann evtl. ein Grund dafür sein. Das müsste man sich einmal im Detail aufschreiben und schauen, was das bedeutet. Und dann könnte man auch schauen, ob man das nicht auf andere Art ebenso hin bekommen kann.

Wenn etwas in der Art notwendig ist, dann könnte man sich überlegen, ob es nicht komplett bei einer Klasse bleiben kann. Die Nodes sind dann auch List Instanzen. Der Listenkopf hat dann halt einfach keine Daten. Die public Methoden von List wandern in Node und alles andere in Node ist private.
Oder in andern Worten: Die Referenz auf List ist schon die Referenz auf den "Dummy Node".

Prinzipiell kann man aber auch schauen, ob da evtl. ein Interface oder so Sinn machen kann - dann hat man einfach ein Verhalten, mit dem man getNext und setNext erhält. Das wäre etwas, über das man auch nachdenken könnte.

Aber ich muss mich wiederholen: Das müsste man im Detail sehen um das zu bewerten. Also obwohl ich jetzt ein kleinen Grund dafür gefunden habe, sehe ich das immer noch nicht anders. (Aber das ist ja auch nicht so, dass es hier um richtig oder falsch geht. Bei dem Code schrillen bei mir aber zumindest die Alarmglocken - der Dummy Node erklärt, dass es kein problem ist, aber aus Clean Code Sicht ist es unschön, weil eben auf sowas geachtet wird....
und die Verbesserung mit n=head.next find ich sehr gut muss ich gleich übernehmen :D
Dann hat Dir der Thread ja auf jeden Fall etwas gebracht - auch ohne dass Du von unserer Position überzeugt wurdest :) (Was ja auch nicht sein muss.)
 
G

Gelöschtes Mitglied 65838

Gast
Ja ich hab zwei Accounts also Joreyk und Mart und ich find deine Antwort gut


PS: dachte TE ist themen Ersteller
 
K

kneitzel

Gast
PS: dachte TE ist themen Ersteller
Themen oder Thread Ersteller, ja genau.

Und Du hast dem TE so geantwortet, dass der Verdacht aufgekommen ist, dass Du die Aufgabe / den TE evtl. im Detail kennst (Vielleicht hat er ja genau so eine Liste vorgegeben, wie Du diese skizziert hast).

Aber das sind ja zwei Punkte - einmal das Thema vom TE und dann Dein Hinweis, den ich und Moxxi als Anlass für weitere Hinweise gesehen haben.
 
G

Gelöschtes Mitglied 65838

Gast
Nungut, beide Listen hätten eine Lösung geboten für die Frage des TE

dass man das "previous" im sinne von vorgängern nicht braucht/hat ( falls der TE keine Doppelt verlinkte Liste hat ) sollte klar geworden sein
und das Grund Prinzip von n.next sollte auch erkennbar sein egal mit oder ohne Pseudo Knoten :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
C Gewinnspiel erstellen mit Algorithmus Java Basics - Anfänger-Themen 3
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
H Minimax Algorithmus in Tic Tac Toe Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
ohneInformatik; Trockentest Algorithmus, mathematischen Zusammenhang angeben Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus Java Basics - Anfänger-Themen 17
mervanpolat Binary Search Algorithmus ausführen Java Basics - Anfänger-Themen 1
J Rekursiver Algorithmus Java Basics - Anfänger-Themen 9
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
S Algorithmus entwicklen, der zu einem gegebenen Datum die Jahreszeit ermittelt Java Basics - Anfänger-Themen 13
rosima26 Merge-Algorithmus Java Basics - Anfänger-Themen 53
C Ein Algorithmus soll schneller werden Java Basics - Anfänger-Themen 24
D Dijkstra Algorithmus Hilfe!! Java Basics - Anfänger-Themen 9
U Den Kuchen aufteilen - aber wie? (Rebalancing-Algorithmus) Java Basics - Anfänger-Themen 14
s_1895 Pseudocode Naiver Algorithmus Java Basics - Anfänger-Themen 17
H String verschlüsseln - eigener Algorithmus Java Basics - Anfänger-Themen 104
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
Düsseldorf2002 Testen meines Algorithmus Java Basics - Anfänger-Themen 1
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Algorithmus java searchAll IKey Java Basics - Anfänger-Themen 4
KogoroMori21 MergeSort Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
fendix Compiler-Fehler Algorithmus zur Bestimmung von Primzahlen Java Basics - Anfänger-Themen 7
S Algorithmus (reelle Zahl <65536 von dezimal zu dual) max. 10 Nachkommastellen Java Basics - Anfänger-Themen 4
G Algorithmus Graphen Java Basics - Anfänger-Themen 10
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
N Selection Algorithmus: Methode wird nicht erkannt (BlueJ) Java Basics - Anfänger-Themen 3
U Meinung zum Dijkstra Algorithmus Java Basics - Anfänger-Themen 6
U Dijkstra Algorithmus Laufzeit Java Basics - Anfänger-Themen 3
L Math.exp also eigenen Algorithmus Java Basics - Anfänger-Themen 2
Kirby.exe Algorithmus entwickeln Java Basics - Anfänger-Themen 37
M Algorithmus Max-Heap? Java Basics - Anfänger-Themen 3
I Labyrinth auf der Basis eines rekursiven Algorithmus Java Basics - Anfänger-Themen 27
CptK Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren Java Basics - Anfänger-Themen 3
A Algorithmus effizienter machen Java Basics - Anfänger-Themen 1
V Algorithmus zur fortlaufenden Berechnung des duechscjnt Java Basics - Anfänger-Themen 1
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
O Labyrinth Algorithmus Java Basics - Anfänger-Themen 3
G Quicksort Algorithmus Java Basics - Anfänger-Themen 12
S Binäre-Suche Algorithmus Java Basics - Anfänger-Themen 1
D Algorithmus in Pseudocode mit log2(n) Operationen erstellen Java Basics - Anfänger-Themen 3
C Laufzeit eines Sortier-Algorithmus ermitteln Java Basics - Anfänger-Themen 4
H aufgabe java luhn algorithmus Java Basics - Anfänger-Themen 10
A Datenstruktur für Savings Algorithmus und Planung von kleinen Programmierprojekten Java Basics - Anfänger-Themen 1
J Algorithmus für eine Reihe implementieren Java Basics - Anfänger-Themen 2
S Dijkstra Algorithmus funktioniert nicht Java Basics - Anfänger-Themen 4
N Denksportaufgabe durch Algorithmus lösen Java Basics - Anfänger-Themen 2
S Problem mit einem rekursivem FloodFill Algorithmus Java Basics - Anfänger-Themen 62
B Algorithmus Square und Multiply Java Basics - Anfänger-Themen 3
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
D Frage Boyer-Moore Algorithmus Java Basics - Anfänger-Themen 7
M Komplexität Algorithmus Java Basics - Anfänger-Themen 8
H Zeichen im algorithmus Java Basics - Anfänger-Themen 4
B Code Verständnisfragen - FLoyd Warshall Algorithmus Java Basics - Anfänger-Themen 1
B Algorithmus zum entmischen einer Zahlenfolge Java Basics - Anfänger-Themen 15
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
T Algorithmus zur Überprüfung eines binären Suchbaums Java Basics - Anfänger-Themen 2
K Best Practice Algorithmus für Berechnung von Zahlenreihenfolge Java Basics - Anfänger-Themen 12
M Simpler Algorithmus läuft extrem langsam. Java Basics - Anfänger-Themen 3
K Erste Schritte Brute Force Algorithmus Java Basics - Anfänger-Themen 2
L Frage zu BubbleSort Algorithmus Java Basics - Anfänger-Themen 2
B gibt es ein Stundenplan-Algorithmus? Java Basics - Anfänger-Themen 11
O Algorithmus-Problem Java Basics - Anfänger-Themen 5
P Euklidischer Algorithmus Java Basics - Anfänger-Themen 9
L Greates Commong Dividend - euklidischer Algorithmus, modulos not positive Java Basics - Anfänger-Themen 5
J Euklidischer Algorithmus Java Basics - Anfänger-Themen 1
S Quicksort Algorithmus Java Basics - Anfänger-Themen 2
S GraphNode --- Dijkstra Algorithmus : NullPointerException Java Basics - Anfänger-Themen 1
B Rekursive Algorithmus schreiben Java Basics - Anfänger-Themen 8
V Algorithmus in einer Methode ausführen Java Basics - Anfänger-Themen 3
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
M Dijkstras Algorithmus Java Basics - Anfänger-Themen 5
S Zusammenhang Datenstruktur/Algorithmus Java Basics - Anfänger-Themen 1
M Simulation - Algorithmus Java Basics - Anfänger-Themen 3
F Erste Schritte Hilfe beim Algorithmus finden Java Basics - Anfänger-Themen 8
D Algorithmus für Punkte auf einem Kreis Java Basics - Anfänger-Themen 0
D Algorithmus zu gegebener Laufzeit implementieren Java Basics - Anfänger-Themen 1
B Doppelte Werte aus Array entfernen ohne Import - Algorithmus Java Basics - Anfänger-Themen 5
C Ideen für einen Algorithmus Java Basics - Anfänger-Themen 1
F Best Practice Algorithmus optimieren - Binaeruhr Java Basics - Anfänger-Themen 2
S Euklid Algorithmus zur Berechnung des GGTs Java Basics - Anfänger-Themen 2
L Welcher Algorithmus ist das ? Java Basics - Anfänger-Themen 9
J Rekursiver Horner-Schema-Algorithmus - Verstehe ich ihn richtig? Java Basics - Anfänger-Themen 2
O Java Zufalls-Verteil-Algorithmus Java Basics - Anfänger-Themen 3
P ganz simpler algorithmus Java Basics - Anfänger-Themen 3
C Sortieren ohne Algorithmus Java Basics - Anfänger-Themen 8
J Algorithmus: Grad von floating zu Grad/Minute/Sekunde Java Basics - Anfänger-Themen 3
A Text Verschriebung/Algorithmus(?) Java Basics - Anfänger-Themen 8
R Rekursionsformel für Laufzeit von Algorithmus Java Basics - Anfänger-Themen 3
E Algorithmus für kart. Produkt: als int [] Feld repräsentiert Java Basics - Anfänger-Themen 10
U Peterson Algorithmus Java Basics - Anfänger-Themen 13
algebraiker Collections Bräuchte Hilfe bei dem Algorithmus - LinkedHashMap Java Basics - Anfänger-Themen 2
S A* Path Algorithmus in Java schon vorhanden Java Basics - Anfänger-Themen 3
S Bubble Sort Algorithmus Java Basics - Anfänger-Themen 3
N Unerklärlich: Rekursiver Algorithmus gibt falschen Datentyp zurück... Java Basics - Anfänger-Themen 4
S Algorithmus (Programmablaufplan) Java Basics - Anfänger-Themen 11
S Algorithmus für Spielbaum Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben