当前位置: 首页 > 知识库问答 >
问题:

如何在DoublyLinkedList中断开随机元素

姬昀
2023-03-14

你好,我正在尝试生成一个随机的双链接列表,但我必须插入一个负值的节点和它的下一个节点(值不重要)到列表的头,但当我编译程序时,我陷入了一个无限循环,有一个重复的数字。我想我把列表连接错了,但我不确定。对于上下文,LC是节点类,tete是头队列是尾,prev和suiv以及next和previous指针。

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;
    }
}

共有2个答案

朱典
2023-03-14

我不知道我是否正确地理解了你的要求。但是这里有一个循环,它将实现一个带有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;

        
    }
 }
 }
司空玮
2023-03-14
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);
    }
}
 类似资料:
  • 问题内容: 我如何寻找地图中的元素,我正在寻找与方法类似的东西。 问题答案: A的排序方式实际上不像,这意味着您无法按索引访问项目。因此,改组通常没有任何意义。但是您可以这样做(我在示例中省略了泛型):

  • 例如:数组中有四个项目。我想随机获取一个,如下所示:

  • 问题内容: 假设您有一些元素 并希望从中随机选择任何颜色。 我把颜色放进去 然后选择一个随机颜色,例如: 所有这些(虽然工作正常)似乎都不必要地复杂。有没有一种简单的方法来选择随机枚举元素? 问题答案: Java的枚举实际上是功能齐全的对象。您可以在声明中添加方法 它将允许您像这样使用它:

  • 本文向大家介绍如何从R向量中选择随机元素?,包括了如何从R向量中选择随机元素?的使用技巧和注意事项,需要的朋友参考一下 从R向量中随机选择元素可确保无偏选择,因为在进行随机选择时,向量中的每个元素都具有由随机选择过程(特别是简单的随机采样选择过程)选择的相等概率。要从R向量中随机选择一个或多个元素,我们可以使用样本函数。 示例 在这里,由于向量x1的大小不大于样本大小500而导致错误。如果要创建一

  • 我的问题很简单。我有以下几点: 如何从该枚举中选择随机元素?我试着解决这个问题,但没有成功。

  • 问题内容: 我正在研究“如何从javascript中的数组随机访问元素”。我发现了许多与此有关的链接。 问题: 但是在这种情况下,我们只能从数组中选择一项,如果我们想要多个元素,那么我们将如何实现这一点,所以请仅从该语句中获取一个数组中的多个元素。 问题答案: 尝试以下无损快速功能: