Связанный список первый и последний элемент не может быть удален - PullRequest
0 голосов
/ 28 марта 2019

Я провел большое исследование на этом форуме и нашел много "решений", но ни одно из них не работает.Может быть, моя ситуация немного отличается, и я, может быть, кто-то может увидеть, в чем проблема.Мне нужно удалить каждый элемент Node, который имеет «значение» меньше заданного (kruvis).

public void Delete()
{
    if (Start == null) return;

    if (Start.Next == null)
    {
        Start = null;
        return;
    }
    if (Current.Next == null)
    {
        Current = null;
    }

    Node temp = Start;
    while (temp.Next.Next != null)
    {
        if (temp.Next == Current)
        {
            temp.Next = Current.Next;
            Current = temp;
            return;
        }
        temp = temp.Next;
    }
}

В другом классе есть другая функция (цикл в функции)

for (MenesioAgentai.Pradzia(); MenesioAgentai.ArYra(); MenesioAgentai.Sekantis())
{
    if (MenesioAgentai.GautiT().Kruvis <= kruvis)
    {
        kruvioSuma += MenesioAgentai.GautiT().Kruvis;
        PasalintiAgentoPrenumeratorius(pren, MenesioAgentai.GautiT());
        MenesioAgentai.Delete();
    }
}

Проблема в том, что первый и последний элемент не удаляются в классе NodeList. У меня есть 3 узла. НачалоКонец, Текущий.(и запечатанный класс Node с данными T и Node Next)

1 Ответ

0 голосов
/ 29 марта 2019

Удаление узла из связанного списка немного сложнее, когда головной узел также необходимо удалить. Проще всего добавить дозорный узел в начале. Следующий код Java объясняет, как удалять узлы, которые имеют меньшее значение, чем заданное значение. Я использовал значение типа int для простоты.

/*
// Node definition
class Node {
   Node next;
   int val;

   Node(int val) {
       this.val = val;
   }
}
*/

public Node delete(Node head, int k) {
    Node sentinel = new Node(Integer.MIN_VALUE);
    sentinel.next = head;

    Node prev = sentinel, curr = sentinel.next;
    while(curr != null) {
        while(curr != null && curr.val < k) {
            curr = curr.next;
        }
        prev.next = curr;
        prev = curr;
        if(curr != null) {
            curr = curr.next;
        }
    }
    return sentinel.next;
}
...