交换链表的相邻元素

时间:2015-02-26 10:00:35

标签: c++

以下是我的代码,用于递归交换链表的相邻元素。交换后我丢失指向每个第二个元素的指针。 输入是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);
    }
}

任何帮助将不胜感激,提前谢谢。

4 个答案:

答案 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将不起作用,您需要通过地址/参考传递吗它喜欢以下链接:

http://coliru.stacked-crooked.com/a/a1e200b687825d80