Permalänk
Medlem

Add metod till doubleLinkedList

Har försökt skriva en add metod till en double linked list. Metoden ska lägga till i listan på angivet index men fungerar inte som den ska. Vad missar jag? Har kommenterat extra noggrant för migsjälv

public void add(int index, E element) throws IndexOutOfBoundsException { //DOUBLE LINKED LIST if (index < 0 || index > size()) { throw new IndexOutOfBoundsException(); } Node newNode = new Node(element); //Det här är noden som ska sättas in if (index == 0) { //kollar först om index är 0, är den det ska man stoppa in i början av listan och sätta nytt head. newNode.setmNextNode(head); //Sätter newNode före headnoden newNode----> headnoden => noder head.setmPrevNode(newNode); //head pekar på newNode newNode<----> headnoden newNode.setmPrevNode(null); //newNode pekar på null null<--->newNode--->headnoden head = newNode; //Pekar head på newNode head => newNode----->noder } else { Node tempNode = head; for (int i = 0; i < index; i++) { // Vi vill hitta indexet före index, för att med det indexet peka på indexet vi ska sätta in på tempNode = tempNode.getmNextNode(); } if (tempNode == null) { //Är tempNode null ska vi stoppa in i slutet i listan tempNode.setmNextNode(newNode); // Sätt newNode som tempNode nästa nod tempNode---->NewNode newNode.setmPrevNode(tempNode); //Sätt newNodes föregående nod till tempNode tempNode<---->NewNode newNode.setmNextNode(null); //Sätt newNodes att peka mot null tempNode<--->NewNode---->null tail = newNode; //Sätt newNode till tail tempNode<--->NewNode => Tail } else { //Annars ska vi stoppa in i mitten av listan någonstans //Skapar noden nextNode som är tempNodes nästa nod. Vi ska stoppa in newNode mellan tempNode och nextNode . tempNode--- newNode---- nextNode Node nextNode = tempNode.getmNextNode(); tempNode.setmNextNode(newNode); //Sätter tempNode nästa nod till newNode tempNode----->newNode newNode.setmPrevNode(tempNode); //Sätter newNodes föregånde nod till tempNode tempNode<---->newNode newNode.setmNextNode(nextNode); //Sätter newnodes nästa nod till nextNode tempNode<---->newNode---->nextNode nextNode.setmPrevNode(newNode); //Sätter nextNode prevNode till newNode tempNode<---->newNode<---->nextNode } } size++; }

Permalänk
Medlem
Skrivet av Wequ:

Har försökt skriva en add metod till en double linked list. Metoden ska lägga till i listan på angivet index men fungerar inte som den ska. Vad missar jag? Har kommenterat extra noggrant för migsjälv

if (tempNode == null) { //Är tempNode null ska vi stoppa in i slutet i listan tempNode.setmNextNode(newNode); // Sätt newNode som tempNode nästa nod tempNode---->NewNode newNode.setmPrevNode(tempNode); //Sätt newNodes föregående nod till tempNode tempNode<---->NewNode newNode.setmNextNode(null); //Sätt newNodes att peka mot null tempNode<--->NewNode---->null tail = newNode; //Sätt newNode till tail tempNode<--->NewNode => Tail }

Nu stannar jag bara vid första felet jag hittar. Du testar om tempNode är null, om den är null så försöker du kalla metoder på en pekare som är null? Jag vet inte vilket språk du skriver i men i C++ så blir resultatet inte så bra i alla fall. Om det är en double-linked list antar jag att du har en tail också, så ta tailNode istället för tempNode så får du sista noden och kör på den istället.

Vad är det förövrigt som inte fungerar?

Observation: Om index inte får vara större än Size, och tempNode alltid är noden för index, kommer då tempNode någonsin vara null? Eller är det tempNode.getmNextNode() == null du vill kolla?

Permalänk
Medlem
Skrivet av Wequ:

if (index == 0) { //kollar först om index är 0, är den det ska man stoppa in i början av listan och sätta nytt head. newNode.setmNextNode(head); //Sätter newNode före headnoden newNode----> headnoden => noder head.setmPrevNode(newNode); //head pekar på newNode newNode<----> headnoden newNode.setmPrevNode(null); //newNode pekar på null null<--->newNode--->headnoden head = newNode; //Pekar head på newNode head => newNode----->noder } else {

Nu vet jag inte hur koden ser ut runtomkring, men beroende på hur den är konstruerad gissar jag att det, utöver vad @SanyaIV redan påpekat, även finns en risk att head i ovan situation kan vara NULL om du försöker göra add på en tom lista?

Permalänk
Medlem
Skrivet av SanyaIV:

Nu stannar jag bara vid första felet jag hittar. Du testar om tempNode är null, om den är null så försöker du kalla metoder på en pekare som är null? Jag vet inte vilket språk du skriver i men i C++ så blir resultatet inte så bra i alla fall. Om det är en double-linked list antar jag att du har en tail också, så ta tailNode istället för tempNode så får du sista noden och kör på den istället.

Vad är det förövrigt som inte fungerar?

Observation: Om index inte får vara större än Size, och tempNode alltid är noden för index, kommer då tempNode någonsin vara null? Eller är det tempNode.getmNextNode() == null du vill kolla?

Ja det är ju självklart tempNode.getmNextNode() == null jag vill kolla. Har justerat det nu. Jag vet inte vad det är som inte fungerar, jag har ett Junit test som klagar på att metoden inte funkar bara. Testet lägger till element till första index, i mitten och i slutet.

Skrivet av Cebor:

Nu vet jag inte hur koden ser ut runtomkring, men beroende på hur den är konstruerad gissar jag att det, utöver vad @SanyaIV redan påpekat, även finns en risk att head i ovan situation kan vara NULL om du försöker göra add på en tom lista?

Jag behöver alltså ett fall som kollar om listan är tom? Har lagt till det nu men det verkar fortfarande strula

public void add(int index, E element) throws IndexOutOfBoundsException { //DOUBLE LINKED LIST if (index < 0 || index > size()) { throw new IndexOutOfBoundsException(); } Node newNode = new Node(element); //Det här är noden som ska sättas in if (size == 0){ //Kollar om listan är tom, är den det så blir noden nytt head och tail head = newNode; tail = newNode; newNode.setmNextNode(null); newNode.setmPrevNode(null); } else if (index == 0) { //kollar om index är 0, är den det ska man stoppa in i början av listan och sätta nytt head. newNode.setmNextNode(head); //Sätter newNode före headnoden newNode----> headnoden => noder head.setmPrevNode(newNode); //head pekar på newNode newNode<----> headnoden newNode.setmPrevNode(null); //newNode pekar på null null<--->newNode--->headnoden head = newNode; //Pekar head på newNode head => newNode----->noder } else { Node tempNode = head; for (int i = 0; i < index; i++) { // Vi vill hitta indexet före index, för att med det indexet peka på indexet vi ska sätta in på tempNode = tempNode.getmNextNode(); } if (tempNode.getmNextNode() == null) { //Är tempNodes nästa node null ska vi stoppa in i slutet i listan -->tempNode---> Null tempNode.setmNextNode(newNode); // Sätt newNode som tempNode nästa nod tempNode---->NewNode newNode.setmPrevNode(tempNode); //Sätt newNodes föregående nod till tempNode tempNode<---->NewNode newNode.setmNextNode(null); //Sätt newNodes att peka mot null tempNode<--->NewNode---->null tail = newNode; //Sätt newNode till tail tempNode<--->NewNode => Tail } else { //Annars ska vi stoppa in i mitten av listan någonstans //Skapar noden nextNode som är tempNodes nästa nod. Vi ska stoppa in newNode mellan tempNode och nextNode . tempNode--- newNode---- nextNode Node nextNode = tempNode.getmNextNode(); tempNode.setmNextNode(newNode); //Sätter tempNode nästa nod till newNode tempNode----->newNode newNode.setmPrevNode(tempNode); //Sätter newNodes föregånde nod till tempNode tempNode<---->newNode newNode.setmNextNode(nextNode); //Sätter newnodes nästa nod till nextNode tempNode<---->newNode---->nextNode nextNode.setmPrevNode(newNode); //Sätter nextNode prevNode till newNode tempNode<---->newNode<---->nextNode } } size++; }

Permalänk
Medlem

Två förslag:

  • Lär dig debuggern i din IDE, stega igenom koden. Om du inte använder en IDE gör du fel, men då får du lära dig jdb

  • I ditt testfall, fånga alla Exceptions, anropa fail() eller logga felet på något annat sätt. Försök skriva ut vilken typ av Exception det är, meddelandet och stacktrace

Du kommer spara enormt med tid om du lär dig använda en debugger. "Jag vet inte vad som är fel" är då inte ett problem längre.