Copie una lista de enlaces con un puntero arbitrario -- java campo con linked-list camp codereview Relacionados El problema

Copy a linkedlist with an arbitrary pointer


2
vote

problema

Español

La descripción de la pregunta completa se encuentra http: / /www.geeksforgeeks.org/a-linked-list-with-next-and-arbit-pointer/ . Buscando revisión de código, optimización, código limpio, etc.

  public class CopyArbit<T> {      private Node<T> first;     private Node<T> last;     private int size;      public CopyArbit() {}      private static class Node<T> {         T item;         Node<T> next;         Node<T> arbit;          Node(T item, Node<T> next, Node<T> arbit) {              this.item = item;              this.next = next;              this.arbit = arbit;         }     }      public void add(T item) {         final Node<T> l = last;         final Node<T> newNode = new Node<T>(item, null, null);         last = newNode;         if (first == null) {             first = newNode;         } else {             l.next = newNode;         }         size++;     }      public void makeArbitrary (int srcPos, int destPos) {         if (first == null) throw new NoSuchElementException("Linkedlist is empty.");          if (srcPos > size || srcPos < 1) {             throw new IllegalArgumentException("The srcPos  " + srcPos + " is out of bound");         }          if (destPos > size || destPos < 1) {             throw new IllegalArgumentException("The destPos  " + destPos + " is out of bound");         }          Node<T> source =  getNodeAtPos(srcPos);          Node<T> destination =  getNodeAtPos(destPos);          source.arbit = destination;     }      private Node<T> getNodeAtPos(int posFromStart) {         assert posFromStart > 0 && posFromStart <= size;          /*          * We need (posFromStart - 1) hops to reach the node at that pos.          */         int hops = posFromStart - 1;         int counter = 0;          Node<T> temp = first;          while (counter < hops) {             temp = temp.next;             counter++;         }          return temp;     }      public CopyArbit<T> getCopy() {         Node<T> temp = first;          // interject nodes in between each other.         // ie convert A->B->C->D into A->A->B->B->C->C->D->D         while (temp != null) {             Node<T> tempAux = new Node<T>(temp.item, temp.next, null);             temp.next = tempAux;             temp =  temp.next.next;         }          // fill in the arbit pointer         temp = first;         while (temp != null) {             Node<T> tempAux = temp.next;             tempAux.arbit = temp.arbit.next;             temp = temp.next.next;         }          return split();     }      private CopyArbit<T> split () {         Node<T> temp = first;          Node<T> first = null;         Node<T> firstHead = null;         Node<T> second = null;         Node<T> secondHead = null;          int counter = 0;          while (temp != null) {             if (counter % 2 == 0) {                 if (firstHead == null) {                     firstHead = temp;                 } else {                     first.next = temp;                 }                 first = temp;             } else {                 if (secondHead == null) {                     secondHead = temp;                 } else {                     second.next = temp;                 }                 second = temp;             }             temp = temp.next;             counter++;         }         first.next = null; // note this step.          CopyArbit<T> copyArbit = new CopyArbit<T>();         copyArbit.first = secondHead;         copyArbit.last = second;         copyArbit.size = size;          return copyArbit;     }      public Iterator<T> iterator() {         return new LinkedListIterator();     }      private class LinkedListIterator implements Iterator<T> {         int currentSize;         Node<T> node;          LinkedListIterator() {             currentSize = 0;             node = first;         }          public boolean hasNext() {             return currentSize < size;         }          public T next() {             T item = node.item;             node = node.next;             currentSize++;             return item;         }          @Override         public void remove() {             // TODO Auto-generated method stub         }     }      public Iterator<T> arbitIterator() {         return new LinkedListArbitIterator();     }      private class LinkedListArbitIterator implements Iterator<T> {         int currentSize;         Node<T> node;          LinkedListArbitIterator() {             currentSize = 0;             node = first;         }          public boolean hasNext() {             return currentSize < size;         }          public T next() {             T item = node.arbit.item;             node = node.next;             currentSize++;             return item;         }          @Override         public void remove() {             // TODO Auto-generated method stub         }     }      public static void main(String[] args) {          CopyArbit<Integer> source = new CopyArbit<Integer>();         source.add(10);         source.add(20);         source.add(30);         source.add(40);          source.makeArbitrary(1, 4);         source.makeArbitrary(2, 1);         source.makeArbitrary(3, 4);         source.makeArbitrary(4, 2);          CopyArbit<Integer> target = source.getCopy();          System.out.println("Expected: 40 10 40 20");         System.out.print("Actual: ");          Iterator<Integer> iterator = target.arbitIterator();         while (iterator.hasNext()) {             System.out.print(iterator.next() + " ");         }     } }   
Original en ingles

The full question description is found http://www.geeksforgeeks.org/a-linked-list-with-next-and-arbit-pointer/. Looking for code review, optimization, clean code etc.

public class CopyArbit<T> {      private Node<T> first;     private Node<T> last;     private int size;      public CopyArbit() {}      private static class Node<T> {         T item;         Node<T> next;         Node<T> arbit;          Node(T item, Node<T> next, Node<T> arbit) {              this.item = item;              this.next = next;              this.arbit = arbit;         }     }      public void add(T item) {         final Node<T> l = last;         final Node<T> newNode = new Node<T>(item, null, null);         last = newNode;         if (first == null) {             first = newNode;         } else {             l.next = newNode;         }         size++;     }      public void makeArbitrary (int srcPos, int destPos) {         if (first == null) throw new NoSuchElementException("Linkedlist is empty.");          if (srcPos > size || srcPos < 1) {             throw new IllegalArgumentException("The srcPos  " + srcPos + " is out of bound");         }          if (destPos > size || destPos < 1) {             throw new IllegalArgumentException("The destPos  " + destPos + " is out of bound");         }          Node<T> source =  getNodeAtPos(srcPos);          Node<T> destination =  getNodeAtPos(destPos);          source.arbit = destination;     }      private Node<T> getNodeAtPos(int posFromStart) {         assert posFromStart > 0 && posFromStart <= size;          /*          * We need (posFromStart - 1) hops to reach the node at that pos.          */         int hops = posFromStart - 1;         int counter = 0;          Node<T> temp = first;          while (counter < hops) {             temp = temp.next;             counter++;         }          return temp;     }      public CopyArbit<T> getCopy() {         Node<T> temp = first;          // interject nodes in between each other.         // ie convert A->B->C->D into A->A->B->B->C->C->D->D         while (temp != null) {             Node<T> tempAux = new Node<T>(temp.item, temp.next, null);             temp.next = tempAux;             temp =  temp.next.next;         }          // fill in the arbit pointer         temp = first;         while (temp != null) {             Node<T> tempAux = temp.next;             tempAux.arbit = temp.arbit.next;             temp = temp.next.next;         }          return split();     }      private CopyArbit<T> split () {         Node<T> temp = first;          Node<T> first = null;         Node<T> firstHead = null;         Node<T> second = null;         Node<T> secondHead = null;          int counter = 0;          while (temp != null) {             if (counter % 2 == 0) {                 if (firstHead == null) {                     firstHead = temp;                 } else {                     first.next = temp;                 }                 first = temp;             } else {                 if (secondHead == null) {                     secondHead = temp;                 } else {                     second.next = temp;                 }                 second = temp;             }             temp = temp.next;             counter++;         }         first.next = null; // note this step.          CopyArbit<T> copyArbit = new CopyArbit<T>();         copyArbit.first = secondHead;         copyArbit.last = second;         copyArbit.size = size;          return copyArbit;     }      public Iterator<T> iterator() {         return new LinkedListIterator();     }      private class LinkedListIterator implements Iterator<T> {         int currentSize;         Node<T> node;          LinkedListIterator() {             currentSize = 0;             node = first;         }          public boolean hasNext() {             return currentSize < size;         }          public T next() {             T item = node.item;             node = node.next;             currentSize++;             return item;         }          @Override         public void remove() {             // TODO Auto-generated method stub         }     }      public Iterator<T> arbitIterator() {         return new LinkedListArbitIterator();     }      private class LinkedListArbitIterator implements Iterator<T> {         int currentSize;         Node<T> node;          LinkedListArbitIterator() {             currentSize = 0;             node = first;         }          public boolean hasNext() {             return currentSize < size;         }          public T next() {             T item = node.arbit.item;             node = node.next;             currentSize++;             return item;         }          @Override         public void remove() {             // TODO Auto-generated method stub         }     }      public static void main(String[] args) {          CopyArbit<Integer> source = new CopyArbit<Integer>();         source.add(10);         source.add(20);         source.add(30);         source.add(40);          source.makeArbitrary(1, 4);         source.makeArbitrary(2, 1);         source.makeArbitrary(3, 4);         source.makeArbitrary(4, 2);          CopyArbit<Integer> target = source.getCopy();          System.out.println("Expected: 40 10 40 20");         System.out.print("Actual: ");          Iterator<Integer> iterator = target.arbitIterator();         while (iterator.hasNext()) {             System.out.print(iterator.next() + " ");         }     } } 
     

Lista de respuestas

2
 
vote
  1. Modería el método main a una clase separada. (Por ejemplo, CopyArbitMain ). Por lo general, es una buena idea separar una clase de sus clientes.

  2. Iterator.remove() Si elimine no es compatible ( de acuerdo con el javadoc ). De todos modos, // TODO Auto-generated method stub4 Comentarios Por lo general, un mal olor, no los dejes en el código.

  3. en lugar de

      if (srcPos > size || srcPos < 1) {     throw new IllegalArgumentException("The srcPos  " + srcPos + " is out of bound"); }   

    Podría usar el 99887765555443336 de la guayaba (o simplemente cree un método similar, si no desea incluir un Biblioteca externa):

      checkArgument(srcPos > size || srcPos < 1, "The srcPos %s is out of bound", srcPos);   

    Es un poco más simple y más fácil de leer.

 
  1. I'd move the main method to a separate class. (For example, CopyArbitMain.) It's usually a good idea to separate a class from its clients.

  2. Iterator.remove() should throw UnsupportedOperationException if remove is not supported (according to the javadoc). Anyway, // TODO Auto-generated method stub comments usually a bad smell, don't leave them in the code.

  3. Instead of

    if (srcPos > size || srcPos < 1) {     throw new IllegalArgumentException("The srcPos  " + srcPos + " is out of bound"); } 

    you could use Guava's checkArgument (or just create a similar method, if you don't want to include an external library):

    checkArgument(srcPos > size || srcPos < 1, "The srcPos %s is out of bound", srcPos); 

    It's a little bit simpler and easier to read.

 
 

Relacionados problema

4  ADT Pila con Linkedlist  ( Adt stack with linkedlist ) 
Actualmente estoy preparando para mi examen y estoy tratando de implementar algunos tipos de datos abstractos con listas vinculadas como preparación para el e...

7  Simulando una lista enlazada lineal usando una matriz  ( Simulating a linear linked list using an array ) 
Un programa para simular una lista enlazada lineal usando una matriz: Especificaciones: A Y: cree un nuevo nodo con el valor de datos y, y agregue este...

5  Cola de bloqueo con la exactitud de la lista doblemente vinculada  ( Lock free queue with doubly linked list correctness ) 
Necesito una cola de bloqueo que se implementa mediante la lista doblemente vinculada. es mi código correcto? ¿Hay algún error? ¿Hay alguna mejoras a realiz...

0  Agregando dos números extremadamente grandes usando una estructura de datos personalizada  ( Adding two extremely large numbers using a custom data structure ) 
Tengo una implementación para agregar 2 números extremadamente grandes, mayor que el techo proporcionado por long , por ejemplo, 1238913893838383813813813813...

10  Lista vinculada de objetos de conejito  ( Linked list of bunny objects ) 
El ejercicio es el ejercicio de la lista de conejitos vinculados; El último ejercicio para principiantes de aquí . Estoy buscando comentarios sobre absolut...

3  Lista doblemente vinculada en óxido usando los punteros crudos  ( Doubly linked list in rust using raw pointers ) 
Estoy practicando la oxidación escribiendo una lista doblemente vinculada usando los punteros crudos, 9988776655544330 Para asignar datos en el montón, 998...

14  Implementando una lista relacionada adecuada para un entorno profesional  ( Implementing a proper linked list for a professional environment ) 
Tengo algunas preocupaciones: ¿Es normal que la clase tenga al menos un nodo? En otras palabras, esta implementación no puede tener una lista vinculada va...

5  Destructor para una lista vinculada  ( Destructor for a linked list ) 
El código completo se encuentra aquí: https://gist.github.com/4521540 < / p> Es un maniquí List en C ++. Mi preocupación es para liberar la memoria. No s...

1  DEQUEUE () en la implementación de la cola que utiliza una lista circular vinculada  ( Dequeue in queue implememtation that uses a circular linked list ) 
Utilizo una lista de enlaces circulares para implementar un queue , y solo sostiene un 99887776665544332 (Tenga en cuenta que 99887776655443333 enlaces a...

4  Eliminar nodos alternativos de una lista vinculada  ( Delete alternate nodes of a linked list ) 
Si la lista vinculada es 1- & gt; 2- & gt; 3- & gt; 4 entonces la salida debe ser 1- & gt; 3. Si la lista vinculada es 1- & gt; 2- & gt; 3- & gt; 4- & gt; 5,...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos