【发布时间】:2012-03-04 16:06:48
【问题描述】:
我正在尝试编写一种算法,该算法可以在 C++ 中交换一个单链表中的两个节点。这是我目前所拥有的:
void swap(ListNode *node1, ListNode *node2)
{
ListNode *prev1 = head;
ListNode *prev2 = head;
//Search previous node for node1:
while(prev1->next!=node1 || prev1 != node1)
prev1 = prev1->getNext();
//Search previous node for node2:
while(prev2->next!=node2 || prev2 != node2)
prev2 = prev2->getNext();
if(node1->next==node2)
{ //This means node1 == prev2?
tail = node1;
node1->next = NULL;
head = node2;
node2->next = node1;
}
else if(node2->next==node1)
{ // node2 == prev1
tail = node2;
node2->next = NULL;
head = node1;
node1->next = node2;
}
if(node1->next == NULL)
{ //node1 is last
node1->next = node2->next;
tail = node2;
node2->next = NULL;
prev1->next = node2;
prev2->next = node1;
}
}
但是我意识到我可以得到的不同情况的数量,比如如果 LL 只有两个元素,或者如果他们在节点 1 之前给了我们节点 2,等等。我意识到它不可能这么复杂和丑陋。那么如何编写交换两个节点的算法呢?
【问题讨论】:
-
具体问题是什么?
-
我们不会在 Stack Overflow(不是网络论坛或留言板)上“提供一些提示”。我们回答有关编程语言的具体问题。
-
“如何交换链表中的两个节点”对我来说听起来是一个非常合理和具体的问题,尽管是重复的。
-
我不能说这不是重复的,但它不是链接问题的重复。这个问题是关于单链表,而不是双链表
-
对于单个链接列表,我的建议是使用额外的间接级别来查找交换的位置(指向要交换的节点的指针),该额外级别简化了案件数量很大。获得这两个位置后,您可以交换指向节点的指针和指向下一个节点的指针。不应该超过 10-15 行,只有两个循环和几个 if。
标签: c++ algorithm linked-list swap