成对交换节点而不交换LinkedList中的数据

时间:2016-07-01 14:09:40

标签: c++ data-structures linked-list

我一直试图成对交换链表元素。我不是通过数据交换元素,而是通过交换链接交换它们:

输入1:1->2->3->4->5 输出1:2->1->4->3->5

输入2:1->2->3->4->5->6 输出2:2->1->4->3->6->5

#include <iostream>
using namespace std;

struct node{
  int data;
  struct node *next;
};

struct node* func(struct node *f, struct node *s){
    if(s==NULL){
        return f;
    }

    struct node *rest1;
    rest1 = s->next;

    s->next = f;
    if(rest1){
        f->next = func(rest1,rest1->next);
    }

    return s;
}

void show(struct node *head){
    while(head!=NULL){
        cout<<" "<<head->data;
        head = head->next;
    }
}

int main() {
    //code
    struct node *head  =(struct node*)malloc(sizeof(struct node));
    head->data=1;
    head->next = (struct node*)malloc(sizeof(struct node));

    head->next->data = 2;
    head->next->next = (struct node*)malloc(sizeof(struct node));

    head->next->next->data = 3;
    head->next->next->next = (struct node*)malloc(sizeof(struct node));

    head->next->next->next->data = 4;
    //head->next->next->next->next=(struct node*)malloc(sizeof(struct node));
    //head->next->next->next->next->data=5;

    head = func(head,head->next);
    show(head);
    return 0;
}

此代码适用于奇数长度列表但不适用于偶数长度。 我认为问题在于:

if(s==NULL){
    return f;
}

我用来制作之前的f->next=NULL语句(如果是偶数长度)。

2 个答案:

答案 0 :(得分:1)

由于您将此标记为C ++,我建议使用STL&#39; <list>。您可以使用splice方法完成您想要的操作,该方法允许您操作列表。一种可能的实现方式如下:

void alternate(list<int>& l)
{
    if (l.empty())
        return;
    auto from_itr = cbegin(l);
    auto to_itr = from_itr;
    for (; ++to_itr != cend(l) && ++to_itr != cend(l);) {
        l.splice(to_itr, l, from_itr);
        ++from_itr;
    }
}

注意:循环中的from_itr仅增加一次,因为它已在列表中移动到下一个感兴趣的节点之前。

答案 1 :(得分:0)

f指向5 s点时,考虑偶数长度列表的情况说1-> 2-> 3-> 4-> 5-> 6到6 &amp; rest1指向null

s-&gt; next = f使节点6-> 5但仍然节点5将指向6.因此将形成循环,其中6-> 5-> 6-> 5 .... ..........等等。

因此,为了使这段代码能够在这里添加一个else语句

if(rest1){
        f->next = func(rest1,rest1->next);
}
else f->next = NULL;

这将使5&gt; NULL阻止无限循环。因此,您的函数将如下所示

struct node* func(struct node *f, struct node *s){
    if(s==NULL){
        return f;
    }

    struct node *rest1;
    rest1 = s->next;

    s->next = f;
    if(rest1){
        f->next = func(rest1,rest1->next);
    }
    else f->next = NULL;
    return s;
}