Замена узлов в одном связанном списке - PullRequest
0 голосов
/ 13 августа 2010

Давным-давно я не использовал C или C ++, поэтому полностью забудьте о указателях.Я знаком с C # и написал базовую версию этого.Нужно знать, правильно ли я делаю / нет?

Ввод: связанный список a-> b-> c-> d-> e-> null

Выход: связанный список b-> a-> d-> c-> e-> null

Мы должны написать код так, чтобы позиция памяти менялась, а не значение узла.

    public void SwapLinkedList(LinkedList<int> LL)
    {
        LinkedListNode<int> current = LL.First;
        while (current.Next != null)
        {
            int temp = current.Next.Value;
            current.Next.Value = current.Value;
            current.Value = temp;
            current = current.Next.Next;
        }
    }

Ответы [ 2 ]

4 голосов
/ 13 августа 2010

Порядок LinkedListNode в пределах LinkedList не может быть изменен, поскольку LinkedListNode допускает только получение свойств Previous и Next.Таким образом, чтобы изменить порядок в пределах LinkedList, вы можете поменять местами только значения (которые позволяют набор).

Чтобы заставить это работать, я бы использовал некоторые методы расширения, подобные этим, чтобы немного поменять местамиболее общий:

public static class LinkedListExtensions
{
    public static LinkedList<T> SwapPairwise<T>(this LinkedList<T> source)
    {
        if (source == null)
            throw new ArgumentNullException("source");

        var current = source.First;

        if (current == null)
            return source;

        while (current.Next != null)
        {
            current.SwapWith(current.Next);
            current = current.Next;

            if (current != null)
                current = current.Next;
        }

        return source;
    }

    public static void SwapWith<T>(this LinkedListNode<T> first, LinkedListNode<T> second)
    {
        if (first == null)
            throw new ArgumentNullException("first");

        if (second == null)
            throw new ArgumentNullException("second");

        var tmp = first.Value;
        first.Value = second.Value;
        second.Value = tmp;
    }
}
0 голосов
/ 03 января 2013

Если у вас есть ссылка на LinkedListNode, предпочтительнее удалить и добавить:

public static LinkedListNode<T> SwapWith<T>(LinkedListNode<T> first, LinkedListNode<T> second)
{
        first.List.Remove(first);
        second.List.AddAfter(second, first);
        return second;
}
...