Как использовать 2 цикла while один за другим в одном методе или другом решении для поиска максимального числа и его удаления - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь понять, как найти и удалить максимальное число в списке. (Мне не разрешено использовать Dictionary, List, LinkedList, SortedList и подобные).

Список чисел преобразуется в массив {1055, 2, 29, 8, 7, 2000, 29, 8, 22, 6, 29,} "s" - это список.

Я могу найти самый высокий номер в списке, и мне кажется, что код для его удаления также правильный, но проблема в том, как он работает в моей голове: 1-й l oop, чтобы найти максимальное число:

int tmp = 0;

while (s != null)
{ 
    if(tmp < s.data)
    {
        tmp = s.data;
    }
    
    s = s.next;
}

Console.WriteLine(tmp);
return null;

Это правильно вернет мне 2000.

И 2-й l oop должен в основном перейти к следующему число, поэтому самый высокий не отображается.

while (s != null)
{
    if (s.data == tmp)
    {
        s = s.next;
    }
    
    Console.Write(s.data + " ");
    s = s.next;
}

Я пытался поиграть с петлями, но не могу понять, как объединить их вместе, чтобы заставить его работать.

Спасибо за любые совет. Я открыт для другого подхода.

Добавление всего соответствующего кода в дело

    class Seznam
    {

        public int data;
        public Seznam next;
        public Seznam prev;


        static void Main(string[] args)
        {
            int[] pole = { 1055, 2, 29, 8, 7, 2000, 29, 8, 22, 6, 29, };

            Seznam s = convertArray(pole); //This is the list

            s = DeleteMax(s);

            Console.ReadLine(); 
        }

        static Seznam DeleteMax(Seznam s)
        {
            int tmp = 0;
            while (s != null)
            { 
                if(tmp < s.data)
                {
                    tmp = s.data;
                }
                s = s.next;
            }
            Console.WriteLine(tmp);
            return null;

        }
    }

Ответы [ 2 ]

0 голосов
/ 04 августа 2020
public static void DeleteMax(Seznam s)
{
    int tmp = 0;
    Seznam max = s;
    while (s != null)
    {
        if (tmp < s.data)
        {
            tmp = s.data;
            max = s;
        }
        s = s.next;
    }
    if (max != null)
    {
        max.prev.next = max.next;
        max.next.prev = max.prev;
    }            
}
0 голосов
/ 04 августа 2020

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

Вот так:

int tmp = 0;
int location = 0;
int counter = 0;
while (s != null)
{
    if (tmp < s.data)
    {
        tmp = s.data;
        location = counter;
    }
    s = s.next;
    counter = counter + 1;
}
Console.WriteLine(tmp);
return null;

После этого вы можете найти его и легко удалить.

...