c# - 在双向链表中交换节点
问题描述
尝试使用以下方法从 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
我哪里错了??我已经研究过有关该主题的先前问题,这给了我代码的想法,但现在卡住了!
解决方案
无论您进行何种更改,您似乎都假设是链表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 作为索引没有任何意义,并且在阅读代码时会引起混淆。
推荐阅读
- android - 如何在运行程序时更改小部件动画
- c# - 无法与 Http2And3 一起启动 Kestrel
- javascript - 从另一个组件重新渲染反应组件的正确方法
- angular - 使用 Angular 问题打破子元素
- c# - DisplayPromptAsync hangs on Uno Platform for Xamarin Forms WASM
- android - 如何删除perfetto写的痕迹
- python - ImportError:无法导入名称“download_url_to_file”
- git - git - 如何安全地存储 https 连接的用户名和密码?
- elasticsearch - Elasticsearch 无痛返回错误的长值
- python - Django F() 和 ExpressionWrapper