以下是我的代码,用于递归交换链表的相邻元素。交换后我丢失指向每个第二个元素的指针。 输入是1-> 2-> 3-> 4-> 5-> 6-> 7,我预期输出2-> 4-> 4-> 3-> 6 - 将5-大于7, 但我的输出是1-> 3-> 5-> 7.
void nodelist::swap(node* head)
{
node* temp = head->next;
if (head->next!= nullptr)
{
node* temp2 = temp->next;
temp->next = head;
head->next = temp2;
head = head->next;
temp = nullptr;
temp2 = nullptr;
swap(head);
}
}
任何帮助将不胜感激,提前谢谢。
答案 0 :(得分:1)
没有递归:
void swap(node **head)
{
while (*head && (*head)->next)
{
node* tmp = *head;
*head = tmp->next;
tmp->next = (*head)->next;
(*head)->next = tmp;
head = &tmp->next;
}
}
调用swap( & list_head_ptr)
。
或者,您可以通过引用指针传递头指针并使用本地指针到指针成员:
void swap(node*& head)
{
node **pp = &head;
while (*pp && (*pp)->next)
{
node* tmp = *pp;
*pp = tmp->next;
tmp->next = (*pp)->next;
(*pp)->next = tmp;
pp = &tmp->next;
}
}
并调用swap(list_head_ptr)
。这两种方法都有效。
答案 1 :(得分:1)
实际上只交换节点的数据成员就足够了。没有必要自己交换指针。
然而,如果要使用您的方法,那么该函数可能看起来像
void SwapList( node *head )
{
if ( head != nullptr && head->next != nullptr )
{
node *next = head->next;
std::swap( *head, *next );
std::swap( head->next, next->next );
SwapList( head->next->next );
}
}
这是一个示范程序
#include <iostream>
#include <utility>
struct node
{
int value;
node *next;
};
node * AddNode( node *head, int value )
{
head = new node { value, head };
return head;
}
void PrintList( node *head )
{
for ( ; head != nullptr; head = head->next )
{
std::cout << head->value << ' ';
}
}
void SwapList( node *head )
{
if ( head != nullptr && head->next != nullptr )
{
node *next = head->next;
std::swap( *head, *next );
std::swap( head->next, next->next );
SwapList( head->next->next );
}
}
int main()
{
node *head = nullptr;
for ( int i = 10; i != 0; )
{
head = AddNode( head, --i );
}
PrintList( head );
std::cout << std::endl;
SwapList( head );
PrintList( head );
std::cout << std::endl;
return 0;
}
输出
0 1 2 3 4 5 6 7 8 9
1 0 3 2 5 4 7 6 9 8
您可以将显示的功能用作功能的模板(或基础)。
答案 2 :(得分:1)
使用递归:
void nodelist::swap(node** head) {
if (!*head || !(*head)->next) return;
node* const sw = (*head)->next;
(*head)->next = sw->next;
sw->next = *head;
*head = sw;
swap(&(sw->next->next));
}
答案 3 :(得分:0)
如果head
是存储firstNode (value=1)
地址的指针,请尝试以下函数:
void nodelist::swap(node* head){
node* temp = head->next; //head->next is first-node which needs to switch with it's next node
if (temp!= nullptr && temp->next!=nullptr){
head->next=temp->next; //move second node to first
temp->next = head->next->next; //put second's next in first's
head->next->next = temp; //and first will be second's next
temp = nullptr; // swaping done
swap(head->next->next); //do it for next couple
}
}
http://coliru.stacked-crooked.com/a/e1cc0d02b5599da4
OR
http://coliru.stacked-crooked.com/a/a1e200b687825d80
如果head
本身是firstNode (value=1)
,那么按值传递head
将不起作用,您需要通过地址/参考传递或吗它喜欢以下链接: