Informacje o nowych artykułach oraz akcjach edukacyjnych prosto na Twojej skrzynce e-mail!

Abstrakcyjne struktury danych: Lista

Lista cykliczna dwukierunkowa wiązana

W poprzednim przykładzie napisaliśmy listę dwukierunkową wiązaną, teraz postaramy się ją przerobić na cykliczną listę dwukierunkową wiązaną. Od poprzedniej naszej listy różni się ona tym, że pierwszy element znacznikiem prev wskazuje na ostatni, a ostatni znacznikiem next na pierwszy.

Graficznie prezentuje się to tak:

Dla przypomnienia, to wszystkie operacje będziemy wykonywać na tym kodzie:

class Value
{
    int value;
    Value next;
    Value prev;

    Value(int x, Value Next, Value Prev)
    {
        value = x;
        next = Next;
        prev = Prev;
    }
}

class List
{
    Value first;
    Value last;

    List()
    {
        first = null;
        last = null;
    }

    Value add(int x, Value v)
    {
        Value l;
        if(first == null)
        {
            l = new Value(x, null, null);
            first = l;
            last = l;
        }
        else
        {
            l = new Value(x, v.next, v);

            if(l.next != null)
                v.next.prev = l;
            else
                last = l;

            v.next = l;
        }

        return l;
    }

    void delete(int x)
    {
        Value f = first;
        Value prev = null;

        while (f != null && f.value != x) {
            prev = f ;
            f = f.next;
        }

        if (f != null)
            if (prev == null)
            {
                first = f.next;
                first.prev = null;
            }
            else
            {
                prev.next = f.next;

                if(f.next == null)
                    last = prev;
                else
                    f.next.prev = prev;
            }
    }

    int searchValue(int x)
    {
        Value f = first;

        while(f != null && f.value != x)
            f = f.next;

        return f.value;
    }
}

public class Main {

    public static void main(String[] args) {
    
}

Nowa metoda add() będzie więc wyglądać tak:

class Value
{
    int value;
    Value next;
    Value prev;

    Value(int x, Value Next, Value Prev)
    {
        value = x;
        next = Next;
        prev = Prev;
    }
}

class List
{
    Value first;
    Value last;

    List()
    {
        first = null;
        last = null;
    }

    Value add(int x, Value v)
    {
        Value l;
        if(first == null)
        {
            l = new Value(x, null, null);
            first = l;
            first.prev = last;
            last = l;
            last.next = first;
        }
        else
        {
            l = new Value(x, v.next, v);

            if(l.next != null)
                v.next.prev = l;
            else
            {
                last = l;
                last.next = first;
            }

            v.next = l;
        }

        return l;
    }

    void delete(int x)
    {
        Value f = first;
        Value prev = null;

        while (f != null && f.value != x) {
            prev = f ;
            f = f.next;
        }

        if (f != null)
            if (prev == null)
            {
                first = f.next;
                first.prev = null;
            }
            else
            {
                prev.next = f.next;

                if(f.next == null)
                    last = prev;
                else
                    f.next.prev = prev;
            }
    }

    int searchValue(int x)
    {
        Value f = first;

        while(f != null && f.value != x)
            f = f.next;

        return f.value;
    }
}

public class Main {

    public static void main(String[] args) {

}

Nowa metoda delete() będzie wyglądać tak:

class Value
{
    int value;
    Value next;
    Value prev;

    Value(int x, Value Next, Value Prev)
    {
        value = x;
        next = Next;
        prev = Prev;
    }
}

class List
{
    Value first;
    Value last;

    List()
    {
        first = null;
        last = null;
    }

    Value add(int x, Value v)
    {
        Value l;
        if(first == null)
        {
            l = new Value(x, null, null);
            first = l;
            first.prev = last;
            last = l;
            last.next = first;
        }
        else
        {
            l = new Value(x, v.next, v);

            if(l.next != null)
                v.next.prev = l;
            else
            {
                last = l;
                last.next = first;
            }

            v.next = l;
        }

        return l;
    }

    void delete(int x)
    {
        Value f = first;
        Value prev = null;

        while (f != null && f.value != x) {
            prev = f ;
            f = f.next;
        }

        if (f != null)
            if (prev == null)
            {
                first = f.next;
                first.prev = last;
            }
            else
            {
                prev.next = f.next;

                if(f.next == null)
                {
                    last = prev;
                    last.next = first;
                }
                else
                    f.next.prev = prev;
            }
    }

    int searchValue(int x)
    {
        Value f = first;

        while(f != null && f.value != x)
            f = f.next;

        return f.value;
    }
}

public class Main {

    public static void main(String[] args) {
    
    }
}

Oczywiście musimy również przeprowadzić drobną modyfikację metody searchValue() tak aby program nam się nie zapętlił:

class Value
{
    int value;
    Value next;
    Value prev;

    Value(int x, Value Next, Value Prev)
    {
        value = x;
        next = Next;
        prev = Prev;
    }
}

class List
{
    Value first;
    Value last;

    List()
    {
        first = null;
        last = null;
    }

    Value add(int x, Value v)
    {
        Value l;
        if(first == null)
        {
            l = new Value(x, null, null);
            first = l;
            first.prev = last;
            last = l;
            last.next = first;
        }
        else
        {
            l = new Value(x, v.next, v);

            if(l.next != null)
                v.next.prev = l;
            else
            {
                last = l;
                last.next = first;
            }

            v.next = l;
        }

        return l;
    }

    void delete(int x)
    {
        Value f = first;
        Value prev = null;

        while (f != null && f.value != x) {
            prev = f ;
            f = f.next;
        }

        if (f != null)
            if (prev == null)
            {
                first = f.next;
                first.prev = last;
            }
            else
            {
                prev.next = f.next;

                if(f.next == null)
                {
                    last = prev;
                    last.next = first;
                }
                else
                    f.next.prev = prev;
            }
    }

    int searchValue(int x)
    {
        Value f = first;
        
        if(f.value == x)
            return f.value;
        else
            f = f.next;

        while(f != null && f.value != x || f != first)
            f = f.next;

        return f.value;
    }
}

public class Main {

    public static void main(String[] args) {
        
}

Strony: 1 2 3 4 5

Spodobało się?

Jeśli tak, to zarejestruj się do newslettera aby otrzymywać informacje nowych artykułach oraz akcjach edukacyjnych. Gwarantuję 100% satysfakcji i żadnego spamowania!

, , , , , , ,

Dodaj komentarz

Komentarze (12)

Odpowiedz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Pin It on Pinterest