如果我定义了一个客户列表,并且我想更改或“上移”列表中选定的客户,我该如何实现? 函数的定义应如下所示:
客户* 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 也无法帮助我
这可能没有意义,这正是我需要帮助的原因
假设这是您的清单:
+-----+ +-----+ +-----+ +-----+ +-----+
|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;
}