【问题标题】:switching two nodes in a linked list切换链表中的两个节点
【发布时间】:2016-06-17 02:49:34
【问题描述】:

我对编程很陌生,我有这个任务,目标是使用这些函数打印出 0123456789 然后 9876543210

bool List::SortSwap()
{
    bool doswap = true;
    ListElement *i =this-> head;
    ListElement *prev =this-> head;
    ListElement *b = i->next;

    while (doswap= true) {
        for (i; i != NULL; i = i->next) {
            if (i != this-> head) {
                prev->next = i;
            }
            if (i->value < b->value) {
                swap(prev, i, b);
                doswap = true;
            }
        }

        doswap= false;
    }

    return doswap;
} 


void List::swap(ListElement * prev, ListElement * a, ListElement * b)
{
    prev->next = b;
    b->next = a;
}

所以如果 doswap 为真,它应该通过我的链表并交换元素,如果它的值小于后面的值,当我运行程序时没有任何反应,我的列表不会打印到屏幕上

【问题讨论】:

  • 听起来您可能需要学习如何使用调试器来单步调试您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs
  • 绘制相关节点及其当前连接。一个接一个地将连接移动到它们的新状态。编写代码来执行您必须进行的连接移动。

标签: c++ list object linked-list


【解决方案1】:

如果ba 的后继者,而aprev 的后继者,那么您必须将b 作为prev 的后继者,将a 作为b 的后继者,以交换ab

void List::swap( ListElement * prev, ListElement * a, ListElement * b)
{
    a->next = b->next; // put successor of b in place of succesor of a
    b->next = a;       // put a in place of successor of b
    prev->next = b;    // put b in place of succesor of prev
}

要按顺序交换列表的元素,您必须首先处理列表的前两个元素。因此,列表的其余部分逐步进行。如果到达最后一个列表元素的前任,则终止。

bool List::SortSwap()
{
    if ( head == nullptr || head->next == nullptr )
        return false;

    bool anySwapped = false;
    // hadle head of list and its successor
    if ( head->value < head->next->value )
    {
        ListElement *temp = head;
        head = head->next;       // successor of head becomes new head
        temp->next = head->next; // successor of old head becomes successor of new head
        head->next = temp;       // new head becomes succesor of old head
        anySwapped = true;
    }

    // continue until predecessor of tail is found
    ListElement *prev = head;
    while ( prev->next != nullptr && prev->next->next != nullptr )
    {
        ListElement *a = prev->next;
        ListElement *b = a->next;
        if ( a->value < b->value )
        {
            swap( prev, a, b );
            anySwapped = true;
        }
        prev = prev->next; // step one forward
    }

    return anySwapped;
}

请注意,(doswap= true) 是一个赋值。循环while (doswap= true) 是无限的。

【讨论】:

    【解决方案2】:

    假设这是节点当前的排列方式,在交换之前:

    prev --> a --> b
    

    另外,假设交换后节点应该是这样的:

    prev --> b --> a
    

    如果上面是交换应该改变的,那么代码 在您的交换功能中需要保存节点“b”的下一个 指针:

    void List::swap(ListElement * prev, ListElement * a, ListElement * b)
    {
         ListElement * temp = b->next;
         prev->next = b;
         b->next = a;
         a->next = temp;
    }
    

    【讨论】:

      【解决方案3】:

      所以你要做的是反转列表 我做过类似的事情。 . .

      void LinkList::ReverseList()
      {
          int Length=0;
          current=Head;
          while (current!=NULL)
          {
      
              current=current->link;
              Length++;
      
          }
      
          cout<<"Length is:"<<Length<<endl;
          Prev=current=Head;
          Temp=Head;
          Temp=Temp->link;
          for (int i= 0; i<Length-1; i++)
          {
              if (i==0)
              {
                  Prev=Temp;
                  current->link=NULL;
                  Temp=Temp->link;
                  Prev->link=current;
                  current=Prev;
      
              }
              else
              {
                  Prev=Temp;
                  if (Temp->link!=NULL)
                 {
                    Temp=Temp->link;
                 }
      
                     Prev->link=current;
                   current=Prev;
      
              }
      
      
          }
          Head=current;
      }
      

      【讨论】:

      • 在第一个 while 循环中只打印链接列表中的值。
      猜你喜欢
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多