Обмен двух элементов двусвязного списка C# - PullRequest
0 голосов
/ 30 апреля 2020

Как я могу поменять местами два элемента двусвязного списка (путем переключения ссылок)? Я понял, что мне нужно рассмотреть четыре случая: изменить с первым / последним элементами, изменить соседние элементы и все другие случаи. Структура ячейки выглядит следующим образом:

public class Item<T>
{
    private T _Data;
    private Item<T> _Next;
    private Item<T> _Prev;

    public T Value
    {
        get { return _Data; }
        set { this._Data = value; }
    }
    public Item(T Data)
    {
        this._Data = Data;
    }
    public Item()
    {
        this._Data = default;
    }
    public Item<T> Next
    {
        get { return this._Next; }
        set { this._Next = value; }
    }
    public Item<T> Prev
    {
        get { return this._Prev; }
        set { this._Prev = value; }
    }
}

Это попытка реализации. Что не так? (Здесь я тоже вставляю сортировку, но все зависит от обмена двумя элементами)

    public override D_List<T> Sorting(D_List<T> a)
    {
        for (int top = 1; top < a.Count; top++)
        {
            int k = top;
            while (k > 0 && a[k-1] > a[k])
            {
                k--;
            }

            if (k == 0)
            {
                a[top].Prev.Next = a[top].Next;
                a[top].Next.Prev = a[top].Prev;
                a[top].Next = a[k];
                a[top].Prev = null;
                a[k].Prev = a[top];
            }
            else if(k == a.Count - 2)
            {
                a[k].Prev.Next = a[top];
                a[top].Prev = a[k].Prev;
                a[k].Next = null;
                a[k].Prev = a[top];
            }
            else if(k+1 == top)//стоят подряд
            {
                a[k].Prev.Next = a[top];
                a[top].Prev = a[k].Prev;
                a[k].Next = a[top].Next;
                a[top].Next = a[k];
                a[k].Next.Prev = a[k];
            }
            else
            {
                a[k].Prev = a[top];
                a[top].Prev.Next = a[top].Next;
                a[top].Next.Prev = a[top].Prev;
                a[top].Prev = a[k].Prev;
                a[top].Next = a[k];
                a[top].Next.Prev = a[top];
            }
        }
        return a;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...