Как разбить случайные элементы в дважды связанном списке

#java #linked-list

#java #связанный список

Вопрос:

здравствуйте, я пытаюсь сгенерировать случайный дважды связанный список, но я должен вставить узел с отрицательным значением и его следующий узел (значение не имеет значения) в начало списка, но когда я компилирую программу, я застреваю в бесконечном цикле с одним повторяющимся числом.Мне кажется, я неправильно соединил список, но я не уверен. Для контекста LC — это класс узла, tete — это head, очередь — это tail, предыдущие и suiv, а также следующий и предыдущий указатели.

 class LC {
    public int data;
    public LC suiv;
    public LC prec;
}


    public class ChainesDouble {
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //Détermine an even number N between 10 and 30

        int N = (int)(Math.random()*16) 5;
        N = (N*2);
        System.out.println("La valeur de N = "   N);
        // Create a doubly linkedlist with N elements
        LC tete = null;
        LC queue = null;
        for (int i = 0; i < N/2; i  ) {
            int valeur = getRandom();
            int next = getRandom();
            //If the generated number is negative insert that number and              
            //next value into the head of the list
            if(valeur <0) {
                LC temp = new LC();
                temp.data = valeur;
                if(tete == null) {
                    queue = temp;
                }
                temp = new LC();
                temp.data = next ;
                tete.prec = temp ;
                temp.suiv = tete ;
                tete = temp ;
                tete.prec = temp ;
                temp.suiv = tete ;
                tete = temp ;
            
                

                //If the number is positive, insert the element and the
                //next element  into the TAIL of the list

            }
            else {
                LC temp = new LC();
                temp.data = valeur;
                if(queue == null) {
                    tete = temp;
                    queue = temp;

                }else {
                    temp.prec = queue;
                    queue.suiv = temp ;
                    queue = temp ;
                }
                temp.prec = queue;
                queue.suiv = temp ;
                queue = temp ;
            }           
        }
       public static int getRandom(){
        int N = (int)(Math.random()*42);
        if(N<21) {
            N -=30;//Rand(-10;-30)
        }
        else {
            N-=11;//Rand(10;30)

        }
        return N;
    }
}
  

Комментарии:

1. Пожалуйста, предоставьте полный фрагмент. Ваш даже не компилируется, потому что нет двух закрытых } . Что такое реализация LC ?

2. @oleg.cherednik я только что отредактировал фрагмент. Извините за это

3. getRnadom() реализация?

4. Я добавил, что @oleg.cherednik

5. Ваш текст был бы намного более читабельным, если бы вы писали первую букву каждого предложения заглавной.

Ответ №1:

 public static void main(String[] args) {
    Random random = new Random();
    int halfSize = random.nextInt(30)   1;
    ListNode head = createLinkedList(halfSize, random);
    System.out.println(printToString(head));
}

private static String printToString(ListNode node) {
    StringBuilder buf = new StringBuilder();

    while (node != null) {
        if (buf.length() > 0)
            buf.append("->");
        buf.append(node.value);
        node = node.next;
    }

    return buf.toString();
}

public static ListNode createLinkedList(int halfSize, Random random) {
    ListNode head = null;
    ListNode tail = null;

    for (int i = 0; i < halfSize; i  ) {
        int one = getRandomValue(random);
        int two = getRandomValue(random);

        if (one >= 0) {
            tail = addTail(one, tail);
            head = head == null ? tail : head;
            tail = addTail(two, tail);
        } else {
            head = addHead(one, head);
            head = addHead(two, head);
        }
    }

    return head;
}

private static ListNode addHead(int value, ListNode head) {
    ListNode node = new ListNode(value);
    node.next = head;

    if (head != null)
        head.prev = node;

    return node;
}

private static ListNode addTail(int value, ListNode tail) {
    ListNode node = new ListNode(value);
    node.prev = tail;

    if (tail != null)
        tail.next = node;

    return node;
}

private static int getRandomValue(Random random) {
    return (random.nextInt(30)   1) * (random.nextBoolean() ? 1 : -1);
}

public static final class ListNode {

    public final int value;
    public ListNode next;
    public ListNode prev;

    public ListNode(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return String.valueOf(value);
    }
}
  

Ответ №2:

Я не знаю, правильно ли я понял ваши требования. Но вот цикл, который позволил бы получить дважды связанный список с вашим tete и очередью. Комментарии объясняют логику.

 class LC {
   public int data;
   public LC suiv;
   public LC prec;
}

public class ChainesDouble {
public static int getRandom(){      
    int N = (int)(Math.random()*42);        
    if(N<21) {          
        N -=30;
    }       else {          
        N-=11;          
    }       
    return N;   
}

public static void main(String[] args) {
    int N = (int)(Math.random()*16) 5;
    N = (N*2);
    System.out.println("La valeur de N = "   N);

    LC tete = null;
    LC queue = null;
    for (int i = 0; i < N/2; i  ) {
        int valeur = getRandom();
        int next = getRandom();
        
        //get the two random values
        LC temp_a = new LC();
        LC temp_b = new LC();
        
        //Store the data in the two nodes
        temp_a.data = valeur;
        temp_b.data = next ;  
        
        //link the two nodes
        temp_a.suiv = temp_b;
        temp_b.prec = temp_a;
        
        //If the list is empty, then initialize tete(head) and queue(tail)
        if(tete == null) {
            tete = temp_a;
            queue = temp_b;
        } else {
            
            if(valeur <0) { //If valeur is negative, add to tete
                    temp_b.suiv = tete;
                    tete.prec = temp_b;
                    tete = temp_a;
            }
            else { //If valeur is positive, add to queue
                   queue.suiv = temp_a;           
                   temp_a.prec =  queue;
                   queue = temp_b;
            }
        }
        
    }
    
    //Test Program
    LC temp = tete;
    while (temp!=null) {
        System.out.println(temp.data);
        temp=temp.suiv;
    }

    //Search for second multiple of 5
    LC search = tete;
    int count = 0;
    boolean found = false;
    while (search!=null) {
        if (search.data%5==0)
            count  ;
        if (count==2) {
            found = true;
            System.out.println("Found " search.data);
            break;
        }
        search = search.suiv;
    }
    
    //if found
    if (found) {
        int position = 5;
        if (search.data%10==0) position = 10;
        System.out.println("Position " position);
        
       //remove search for current position
        if (search.suiv!=null) {
            LC prev = search.prec;
            LC next = search.suiv;
            prev.suiv = next;
            next.prec = prev;
        } else {
            search.prec.suiv = null;
        }
        
        //move pointer to desired position
        LC move = tete;
        int cur = 1;
        while(move!=null) {
            move = move.suiv;
            cur  ;
            if (cur==(position - 1)) {
                break;
            }
        }
        System.out.println("shifting " search.data " to after " move.data);
        //link searched item into desired position

            search.suiv = move.suiv;
            move.suiv.prec = search;
            move.suiv = search;
            search.prec = move;

        
    }
 }
 }
  

Комментарии:

1. Я только что использовал ваш метод, и он работает, но он не выводит весь список из N элементов

2. @QuangCao, я протестировал это, и это сработало нормально. Сколько элементов он показал и чего вы ожидали?

3. ну, например, когда он говорит, что N = 10, он выводит только 3 элемента, и иногда он выдает исключение nullpointer

4. Позвольте мне вставить всю программу

5. это может быть из-за других частей моей программы, но я не могу опубликовать все это здесь, это слишком долго, ха-ха @Kasalwe