#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