首页 > 解决方案 > 在双向链表中交换节点

问题描述

尝试使用以下方法从 c# 中的双向链表交换第二个和第三个节点:-

public static void swapNodes(List dblLinkList)
{
    Node tempnodeTwo = dblLinkList.firstNode.next;          //node two in list
    Node tempnodeThree = dblLinkList.firstNode.next.next;   //node three in list

    Node tempnodeFive = tempnodeTwo.previous;
    Node tempnodeSix = tempnodeThree.next;

    tempnodeThree.previous = tempnodeFive;
    tempnodeThree.next = tempnodeThree;
    tempnodeTwo.previous = tempnodeTwo;
    tempnodeTwo.next = tempnodeSix;
}

下面显示了输出:第一个是原始列表,第二个是方法的结果。

N:19:16 19:16:9 16:9:15 9:15:15 15:15:N
N:19:16 16:16:15 9:15:15 15:15:N

我哪里错了??我已经研究过有关该主题的先前问题,这给了我代码的想法,但现在卡住了!

标签: c#

解决方案


无论您进行何种更改,您似乎都假设是链表tempnodeThree的第三个节点并且是第二个节点,但事实并非如此。tempnodeTwo

初始化后你得到的是:

tempnodeFive <--> tempnodeTwo <--> tempnodeThree <--> tempnodeSix

你需要的是:

tempnodeFive <--> tempnodeThree <--> tempnodeTwo <--> tempnodeSix

所以你必须从左到右改变的是:

tempNodeFive.next, tempNodeTwo.previous, tempNodeTwo.next, tempNodeThree.previous, tempNodeThree.next,tempNodeSix.previous

让我们按照第二个链表表示来回顾它们:

tempNodeFive.next = tempNodeThree;
tempNodeTwo.previous = tempnodeThree;
tempNodeTwo.next = tempnodeSix;
tempNodeThree.previous = tempnodeFive;
tempNodeThree.next = tempnodeTwo;
tempNodeSix.previous = tempnodeTwo;

这六行是你需要的。

PS:您可以重新考虑变量名称以获得可读和可维护的代码,尤其是。tempNodeFive 和 tempnodeSix 因为 5 和 6 作为索引没有任何意义,并且在阅读代码时会引起混淆。


推荐阅读