在单个链表中向上移动项目 C++

问题描述 投票:0回答:1

如果我定义了一个客户列表,并且我想更改或“上移”列表中选定的客户,我该如何实现? 函数的定义应如下所示:

客户* move_up(消费者* head, int k){}

k 是我们想要将客户移动到其之前的一个位置,即 k-1

请帮忙

这是我写的:

consumer* move_up(consumer* head, int k){
    //we have exactly 3 cases
    
    consumer* CurrentCons = head;
    consumer* prevCons = nullptr;
    
    
    if(k == 1 && prevCons != nullptr){
        CurrentCons->next = prevCons->next;
        CurrentCons = CurrentCons->next;
    }else if(k==2){
        head = CurrentCons;
    };
    
    if(CurrentCons != nullptr){
        for(int i = 1 ; i<k ; i++){
            
            prevCons = CurrentCons;
            CurrentCons = CurrentCons->next;
            
            
        }
    };

即使聊天 gpt 也无法帮助我

这可能没有意义,这正是我需要帮助的原因

c++ function oop pointers iterator
1个回答
0
投票

假设这是您的清单:

      +-----+  +-----+  +-----+  +-----+  +-----+
      |11| -|->|22| -|->|33| -|->|44| -|->|55| -|->nullptr
      +-----+  +-----+  +-----+  +-----+  +-----+
node no. 1        2        3        4        5     [k]
  • 如果

    k
    的值为
    2
    (即向上移动
    2
    nd 节点),那么您只需要有关其前一个节点(即第一个节点)和向上移动
    2
    nd 节点后的信息,它将成为第一个节点。

      [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] -> .....
    
  • 如果

    k
    的值大于
    2
    2
    nd节点之后的任何节点),则需要有关位置
    k
    处节点的前两个节点的信息。

      [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] -> .....
    
  • 如果

    k
    的值小于或等于
    1
    或超出列表长度的任何值,则列表应保持不变。

牢记以上几点,你可以做到:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.