在单链表中有效地交换元素

时间:2014-01-21 00:42:12

标签: c++ singly-linked-list

我在C ++中编写了一个函数,可以在单个链表中成对交换元素。但是,我想知道是否有更有效的方法来做同样的事情。具体来说,我写的函数有一个案例,当链表中只有两个元素时就会处理。我想知道这个案例是否可以省略并放在一般情况下。我试过这样做,但未能得到输出。可能吗?这是我的代码片段......

struct Node* swap(struct Node* head){
  struct Node* temp = NULL;
  struct Node* cur;
  struct Node* next;

  cur = head;
  next = cur->next;

  // Empty list.
  if(head == NULL){
    cout<<"List is empty. \n";
    return NULL;
  }

  // Only one element in the list.
  if(next == NULL){
    return cur;
  }

  // If two elements in the list.
  else if(next->next == NULL){
    cur->next = NULL;
    next->next = cur;
    return next;
  }

  // General case.
  else{
    head = next;
    while(cur!=NULL){

      if(next == NULL)
        break;

      if(next->next == NULL)
        break;      

      cur->next = next->next;
      next->next = cur;


      if(temp == NULL)
        temp = cur;

      else{
        temp->next = next;
        temp = cur;
       }    

       cur = cur->next;
       next = cur->next;


     }
    return head;
    }
 }

2 个答案:

答案 0 :(得分:0)

是的,您可以包含两元素大小写,一元素大小写和一般情况下的零元素大小写。循环可以从

开始
while(cur != NULL && cur->next != NULL)

答案 1 :(得分:0)

除非我遗漏了某些东西,否则Beta的解决方案似乎应该这样做。

另外,不是答案而是打扰我:

if(temp == NULL){
    temp = cur;
}
else{
    temp->next = next;
    temp = cur;
}   

如果temp最终以cur结尾,你可以将其压缩成

if(temp != NULL){
    temp->next = next;
}
temp = cur;