我不知道问题是否可以正确表达我的问题,希望移植和代码对您有所帮助。英语不是我的母语,所以请耐心等待。这是一项家庭作业,因此我不能使用与库stl相关的东西。 如何正确地遍历没有while / for循环的链表,并返回当前指针并赋予相同的指针 功能? (也许是相互递归?我只是说,也许我的想法是错误的。)
让我们假装在程序执行期间不断发生某些事情(这是一个使我成真的外部变量)。 如何始终遍历同一列表,而不必总是从头开始?
从程序的执行开始,显然它必须从头开始,但是随后我应该能够“返回” 下一个指针,然后是下一个。
假装我们有数字列表(1、2、3、4、5、6、7); 程序启动,我返回指向1的指针,这很好,在程序执行相同的过程中,发生了一些事情 并且我需要返回2,再次,再次发生某些情况,然后该函数应返回3,依此类推。 我怎样才能做到这一点? 您所看到的代码是我想要做什么的一个想法。我不确定我想做什么,如果不是,我该怎么办?
struct node {
int val;
node* next;
};
class random {
public:
node* head = NULL;
node* create() {
node* tmp;
for (int i = 1; i < 8; i = i + 1) {
tmp = new node;
tmp->val = i;
tmp->next = head;
head = tmp;
}
return this->head;
}
bool SomethingHappens() {
if // somethingHappens
return true;
}
node* RightPointer(node* current) {
bool somethinghappened;
somethinghappened = SomethingHappens();
if (somethinghappened) {
current = current->next;
}
return current;
}
};
int main(int argc, char** argv) {
random list;
list.RightPointer(list.head);
return 0;
}
答案 0 :(得分:0)
类似的东西
node* ptr = list.head;
while ((ptr = list.RightPointer(ptr)) != nullptr)
{
// Do something with the pointer
}
我们首先用RightPointer
调用list.head
(由于ptr
的初始化)。每次对RightPointer
的调用都将返回相同的节点(如果什么都没有发生)或返回next
指针(如果发生了什么)。
到达列表末尾时,该函数将返回一个空指针,该指针使循环条件为假并停止迭代。
为使代码对于初学者来说更容易阅读,上述循环等效于此:
// Get the first node back from RightPointer
node* ptr = list.RightPointer(list.head);
// Loop while the pointer returned by RightPointer isn't a null pointer
while (ptr != nullptr)
{
// Do something with the pointer...
// ...
// ...
// ...
// Get the (possibly) next pointer from RightPointer
ptr = list.RightPointer(ptr);
// Note that the above call could return the same node that was passed to it
// Or it might return ptr->next
// This means the above assignment could either be equivalent to
// ptr = ptr;
// or
// ptr = ptr->next;
}