обмен соседних узлов в связанном списке - PullRequest
1 голос
/ 29 августа 2010

У меня проблемы с перестановкой соседних узлов в связанном списке.

для примера: input: 1-> 2-> 3-> 4-> 5-> null output: 2-> 1-> 4-> 3-> 5-> null

bool swapAdjacent(node** head)
{

//1->2->3->4->null

//2->1->4->3->null
if(head==NULL)
return 0;
node* current  = *head;
*head = (*head)->next ;
node* prev = NULL;
cout<<"head val "<<(*head)->data <<endl;
node* temp;
while( current!=NULL&&current->next!=NULL)
{
   temp = current->next ;  //1s pointer points to 2
   current->next = temp->next ;    // 1s pointer point to 3
   temp ->next = current;   //2s pointer shud point to 1
   prev = current;
   current = current->next ;
   //cout<<"data " <<current->data <<endl;

   if(current!=NULL)
   prev->next = current->next ;



}

return 1;
}

Мой код не работает, если нет нечетных узлов.Как это исправить?

Ответы [ 5 ]

6 голосов
/ 29 августа 2010

Почему так сложно?

int swapAdjacent(node** head) {
  if (!*head || !(*head)->next)
    return 0;
  node* const sw = (*head)->next;
  (*head)->next = sw->next;
  sw->next = *head;
  *head = sw;
  swapAdjacent(&(sw->next->next));
  return 1;
}

Редактировать: изменилось возвращаемое значение.

0 голосов
/ 25 апреля 2013

вы берете два указателя ... Изначально p1 указывает на 1-й узел и p2 на 2-й узел

и повторяет его в цикле, пока p2 указывает на ноль ... и приращение цикла должно быть

 p1=(p1->next)->next;
 p2=(p2->next)->next;
 //swap the node pointed by these two pointers ..

это будет работать очень хорошо ..

0 голосов
/ 03 апреля 2012
public static node adjacent_reversal(node head)
{
   node temp = null;
   if(head == null)
       return null;
   if(head.next == null)
   {
       head.next = null;
       return head;
   }
   temp = adjacent_reversal(head.next.next);
   node temp1 = head.next;
   head.next.next = head;
   head.next = temp;
   return temp1;
}
0 голосов
/ 22 апреля 2011
#include<iostream.h>
#include<stdlib.h>
#include<conio.h>
struct s_sll
{
    int info;
    struct s_sll *link;
};
typedef s_sll node;
class sll
{
    public:
        static int cou;
        node *first;
        sll()
        {
        first=NULL;
        cou++;
        }
        node*create_node(int val);
        node*del_val();
        void disp();
        void swap_adjcent();
        ~sll()
        {
        delete first;
        cou--;
        }
};
void disp_all(sll **);
void despose(sll **);
int sll::cou=0;
void sll::swap_adjcent()
{
    node *temp,*a,*b;
    a=first;
    b=a->link;
    temp=b->link;
    a->link=temp->link;
    b->link=a;
    first=b;
    while(b!=NULL)
    {
        a=temp;
        b=temp->link;
        temp=b->link;
        if(temp->link!=NULL)
        {
        a->link=temp->link;
        b->link=a;
        a=temp->link;
        }
        else
        {
        a->link=temp;
        b->link=a;
        }
    }
    delete temp;
}
node* sll::create_node(int val)
{
    node *save,*temp;
    temp = new s_sll;
    temp->info=val;
    temp->link=NULL;
    if(first==NULL)
        first=temp;
    else
    {
        save=first;
        while(save->link!=NULL)
            save=save->link;
        save->link=temp;
    }
    return first;
}
0 голосов
/ 29 августа 2010

Я не знаю, что не так с вашим кодом, но я бы подошел к нему, показывая состояние списка при каждом прохождении цикла:

void printList(node* head)
{
    int cntr = 1;

    while (head != NULL)
    {
        printf("(Node: %d. Name: %s) --> ", cntr, head->name);
        head = head->next;
    }
}

Для этого убедитесь, что у каждого узла есть name, установленное в «1», «2» и т. Д. Затем распечатывайте состояние списка на каждом проходе, возможно, даже на каждом этапе! И вы должны увидеть, что происходит не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...