更改列表 C++ 的顺序

altering order of list c++

提问人: 提问时间:11/5/2023 更新时间:11/5/2023 访问量:78

问:

如果我定义了一个项目列表,并且我想更改或更改所选项目之一在列表中的顺序,我该如何实现?

函数的定义应如下:

items* shift_back(item* head, int i){
    ....
    ....
}
C++ 函数 oop 指针 迭代器

评论

1赞 Some programmer dude 11/5/2023
在这种情况下永远不会是真的。if(k == 1 && prevCons != nullptr)prevCons != nullptr
2赞 Some programmer dude 11/5/2023
另一方面,大括号括起来的语句块 () 不需要用分号终止。你似乎知道这一点,因为你不是为循环而做的,只有 .怎么会这样?{};forif
1赞 Sam Varshavchik 11/5/2023
不幸的是,Stackoverflow 不是 C++ 教程站点或帮助站点,我们只回答有关编程主题的特定问题。您知道如何使用调试器吗?当你用它来运行你的程序时,你的调试器向你展示了什么,一次一行?

答:

1赞 H.S. 11/5/2023 #1

假设这是您的列表:

      +-----+  +-----+  +-----+  +-----+  +-----+
      |11| -|->|22| -|->|33| -|->|44| -|->|55| -|->nullptr
      +-----+  +-----+  +-----+  +-----+  +-----+
         1        2        3        4        5     [k represents position of a node]
  • 如果的值为 is(即向上移动 nd 节点),那么您只需要有关其上一个节点的信息,该节点是第一个节点,在向上移动 nd 节点后,它将成为第一个节点。k222

      [k - 1] -> [k] -> [k + 1] -> [k + 1] -> .....
      -------     |
         |        +- This node next pointer need to set to [k - 1]
         +- This node next pointer need to set to [k + 1] 
    
      // after moving up kth position node 
    
      [k] -> [k - 1] -> [k + 1] -> [k + 1] -> .....
    
     example [k = 2]:
        +-----+  +-----+  +-----+  +-----+  +-----+
        |22| -|->|11| -|->|33| -|->|44| -|->|55| -|->nullptr
        +-----+  +-----+  +-----+  +-----+  +-----+
    
  • 如果的值大于(nd node 之后的任何节点),则需要有关位置 节点的前两个节点的信息。k22k

      [k - 3] -> [k - 2] -> [k - 1] -> [k] -> [k + 1] -> [k + 1] -> .....
                 -------    -------     |
                    |          |        +- This node next pointer need to set to [k - 1]
                    |          +- This node next pointer need to set to [k + 1]
                    +- This node next pointer need to set to [k]
    
       // after moving up kth position node up
    
      [k - 3] -> [k - 2] -> [k] -> [k - 1] -> [k + 1] -> [k + 1] -> .....
    
     example [k = 4]:
        +-----+  +-----+  +-----+  +-----+  +-----+
        |11| -|->|22| -|->|44| -|->|33| -|->|55| -|->nullptr
        +-----+  +-----+  +-----+  +-----+  +-----+
    
  • 如果 的值小于或等于或超出列表长度的任何值,则列表应保持不变。k1

牢记以上几点,您可以执行以下操作:

consumer* move_up (consumer* head, int k) {
    consumer* ll = head;
    consumer* prev = nullptr;

    for (int i = 1; (i < k - 1) && (ll != nullptr); ++i) {
        prev = ll;
        ll = ll->next;
    }

    if ((k > 1) && (ll != nullptr) && (ll->next != nullptr)) {
        consumer* x = ll->next;
        ll->next = ll->next->next;
        x->next = ll;
        ll = x;
    }

    if (prev != nullptr) {
        prev->next = ll;
        ll = head;
    }

    return ll;
}

几点建议:

  • 避免使用原始指针,而是使用智能指针
  • 让自己了解容器库。 可能是您感兴趣的。C++std::forward_list