Как я могу удалить первый и последний узел из двусвязного списка? - PullRequest
0 голосов
/ 27 мая 2019

У меня есть домашняя работа, чтобы написать метод, который удалит FIRST-узел и вернет его значение в двусвязный список в O (1), и еще один метод, чтобы удалить LAST-узел в двусвязном списке и вернуть его значение в O (1). Это то, что я сделал до сих пор.

class DoubleList<T>
{
    DNode _start;
    DNode _end;

    public void AddFirst(T value)
    {
        DNode tmp = new DNode(value);
        tmp._next = _start;
        tmp._prev = null;
        if (_start != null)
        {
            _start._prev = tmp;
        }
        _start = tmp;
        if (_start._next == null)
            _end = tmp;
    }

    public void AddLast(DoubleList<T> doubleyList, T value)
    {
        DNode tmp = new DNode(value);
        if (_start == null)
        {
            AddFirst(value);
            return;
        }
        DNode lastNode = GetLastNode(doubleyList);
        lastNode._next = tmp;
        tmp._prev = lastNode;
        _end._next = tmp;
        _end = tmp;
    }
}

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

В C # уже есть класс doubleList с этими методами.

Проверьте эту ссылку: https://docs.microsoft.com/fr-fr/dotnet/api/system.collections.generic.linkedlist-1?view=netframework-4.8

0 голосов
/ 27 мая 2019

Вот быстрое решение, которое я нашел, пытаясь использовать ваш синтаксис:

public DNode RemoveHead()
{
    // "Save" the current head to return it at the end
    DNode head = _start;

    if (_start != null)
    {
        // The start becomes the element next to the current one
        _start = _start._next;

        // The first node has to have no "previous" one
        if (_start != null) _start._prev = null;
    }

    return head;
}

public DNode RemoveTail()
{
    // "Save" the current tail to return it at the end
    DNode tail = _end;

    if (_end != null)
    {
        // The end becomes the element previous to the current one
        _end = _end._prev;

        // The last node has to have no "next" one
        if (_end != null) _end._next = null;
    }

    return tail;
}
...