在单个链表上交换节点

时间:2010-08-13 03:57:51

标签: c# .net algorithm linked-list

很久以前我没有使用过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 个答案:

答案 0 :(得分:4)

LinkedListNode中的LinkedList订单无法更改,因为LinkedListNode仅允许获取PreviousNext属性。因此,要更改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;
    }
}

答案 1 :(得分:0)

如果你有关于LinkedListNode的参考,请选择删除并添加:

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