成对交换链表

时间:2015-01-24 21:26:19

标签: algorithm linked-list singly-linked-list

我一直试图成对交换链表元素。我不是通过数据交换元素,而是通过交换链接来交换元素。

C#代码:

public LinkedList pairWiseSwapLinks(LinkedList ll)
{
    LinkedList curr = ll;
    LinkedList next = curr.nextNode;

    ll = curr;

    while (curr.nextNode != null && next.nextNode != null)
    {
        curr.nextNode = next.nextNode;
        next.nextNode = curr;

        Console.WriteLine(curr.data);
        Console.WriteLine(next.data);

        curr = curr.nextNode;
        next = curr.nextNode;

        Console.WriteLine(curr.data);
        Console.WriteLine(next.data);
    }

    return ll;
}

输入为:1 - > 3 - > 10 - > 14 - > 16 - > 20 - > 40 输出:1 - > 10 - > 16 - > 40

有人可以帮助我解决我的错误吗?

1 个答案:

答案 0 :(得分:0)

有两个问题:

  1. 在所有交换之后,你的第一个节点应该是3而不是1,所以你应该返回原来的第二个节点(如果那里只有1个?)。
  2. 在您的情况下跳过14的原因是因为您在每次交换中只涉及2个节点。那么在第一次交换之后发生的事情是列表变为3 - > 1 - > 10 - > 16 ...和14 - > 10 - > 16基本上你已经失去了14(即你没有改变" nextNode"节点1中的ref,在这种情况下应该指向14)。
  3. 我不想在这里给你直接解决方案,但我可以给你一些提示:

    1. 每个交换需要涉及3个节点。
    2. 但是,如果只有1/2个节点呢?
    3. 将所有角落案例添加到您的代码中会使它有点难以理解,所以如果我将一个虚拟节点添加到列表的头部,那么最终我可以写"返回dummy.next"而不是打扰找到当前的第一个节点?