List uppgifter: removeNthRek och removeNthIter



Här utökas klassen Node1 med metoderna removeNthRek() och removeNthIter(), som båda tar bort det i:te elementet i en lista, givet ett tal i. Den första metoden har skrivits rekursivt, och använder de redan givna primitiverna. Fallanalysen för metoden är följande:

1-Om listan är tom, returnera fel.
2-Om index i är mindre än ett (vi vet att listan är icketom), returnera fel.
3-Om nuvarande index inte är lika med i (vi vet att listan är icketom och index större eller lika med ett), anropa funktionen med en lista som ej innehåller nuvarande index.
4-Annars (om index är lika med i) returnera resten av den nuvarande listan med i borttaget. Lägg sedan till resten av den ursprungliga listan medans vi går ut ur funktionen.

Den iterativa metoden använder inga primitiver, utan förlitar sig på variabler och for-loopar för att lösa uppgiften. En for-loop hittar det i:te elementet och sätter de föregående elementen i en annan lista, och vi sätter tillbaka värdena efter att ha tagit bort det i:te elementet med hjälp av en annan for-loop.
Även ett huvudprogram har skrivits för att testa metoderna. För utskrift av listorna har en metod print() gjorts, som rekursivt skriver ut innehållet av en lista.




import java.io.*;

class Node1 {
  
   private int data;
   private Node1 vidare;
   private boolean empty;
   
   //konstruktor
   
   public Node1(int in, Node1 vid) {
      vidare=vid;
      empty=false;
      data = in;
   }
   
   public Node1() {
      empty=true;
   }
   
   
   //klassiska primitiver
   
   public Node1 concat(int in) {
      Node1 n = new Node1(in,this);
      return n;
   }
   
   public int first() {
      return data;
   }
      
   public Node1 rest() {
      return vidare;
   }
   
   public boolean isEmpty() {
      return empty;
   }
   
   public void print(){  //skriver ut listan
      if (empty) {
         return;
      }
      System.out.print(data+ " ");
      rest().print();
   }

   public Node1 removeNthRek(int i) {   //tar bort i:te elementet rekursivt
      if (isEmpty()) {       //kolla om listan är tom
          System.out.println("Listan är tom.");
          return null;
      }
      if (i<1) {             //se om man anropat funktionen med fel index
          System.out.println("Fel index! Elementen har index större än noll!");
          return null;
      }
      if (i==1){            //hoppar över i
          return rest();
      }
      return rest().removeNthRek(i-1).concat(first()); //fortsätter tills vi kommer fram till i
   }

   public Node1 removeNthIter(int i) {
      if (empty) {
          System.out.println("Listan är tom.");
          return null;
      }
      if (i<1) {
          System.out.println("Fel index! Elementen har index större än noll!");
          return null;
      }
      Node1 temp=this;
      Node1 temp1=new Node1();
      for (int n=0; n< i-1; n++) {  //sätt in data i elementen till vänster om i in i temp1
          temp1=new Node1(temp.data,temp1);   
          temp=temp.vidare;
      }
      temp=temp.vidare;            //hoppa över det i:te elementet
      for (int n=0; n< i-1; n++) {  //sätt ihop temp1 med resten av listan
          temp=new Node1(temp1.data,temp);
          temp1=temp1.vidare;
      }
      return temp;
   }

   public static void main(String[] args) {
      int n=4;
      Node1 l1=new Node1();
      Node1 l2=l1.concat(9);
      Node1 l3=l2.concat(7);
      Node1 l4=l3.concat(5);
      Node1 l5=l4.concat(3);
      Node1 l6=l5.concat(1);

      System.out.print("Listan före: ");
      l6.print();
      System.out.println();
      System.out.print("Listan efter (rekursivt): ");
      l6.removeNthRek(n).print();
      System.out.println();
      System.out.print("Listan efter (iterativt): ");
      l6.removeNthIter(n).print();
      System.out.println();
      System.out.print("Testar en tom lista: ");
      l1.removeNthRek(4);
      System.out.print("Testar med en index mindre än 1: ");
      l6.removeNthRek(-1);

   }
}


Tillbaks till huvudsidan

email: Alireza.Niai_nouri.2077@student.uu.se