Objective c 按指针传递目标C-链表
我正在解决这个问题,以返回单个链接列表最后一个元素的第k个元素 我试图实现这个通过引用传递值的C解决方案。并在目标C中通过指针进行传递 目前代码无限运行,我不确定在目标C中是否可以通过指针传递 首先是C++示例代码Objective c 按指针传递目标C-链表,objective-c,recursion,linked-list,Objective C,Recursion,Linked List,我正在解决这个问题,以返回单个链接列表最后一个元素的第k个元素 我试图实现这个通过引用传递值的C解决方案。并在目标C中通过指针进行传递 目前代码无限运行,我不确定在目标C中是否可以通过指针传递 首先是C++示例代码 出于好奇,你为什么要在Obj-C中这样做?你可以用C++编译。我这样问是因为你似乎不太懂通过引用传递还是指针传递。此外,如果您确实希望在Obj-C中执行此操作,您仍然可以执行按引用传递 在任何情况下,您的代码都有一些问题: 由于已改为使用指针,因此需要传递地址 我的 由于您现在
出于好奇,你为什么要在Obj-C中这样做?你可以用C++编译。我这样问是因为你似乎不太懂通过引用传递还是指针传递。此外,如果您确实希望在Obj-C中执行此操作,您仍然可以执行按引用传递 在任何情况下,您的代码都有一些问题:
- 由于已改为使用指针,因此需要传递地址 我的李>
- 由于您现在使用的是指针,因此必须取消引用, 增量,并重新分配增量
- 你没有复制这个例子
正确编码并使用
而不是head
head->next
- (Node *)nthToLast:(int)k withHead:(Node *)head andCounter:(int *)i {
// If Node is an Obj-C class, then use nil
// If Node is a C++ struct/class then use NULL
// If you have c++11 and it is a C++ struct/class use nullptr
if (head == nil) {
return nil;
}
Node *nd = [self nthToLast:k withHead:head->next andCounter:i];
// I've pulled the value in count to make it clear what is being done
// i++ is pointer arithmetic, which is not what you want to do here
int count = *i;
++count;
*i = count;
if (count == k) {
return head;
}
return nd;
}
- (Node *)nthToLast:(int)k withHead:(Node *)head {
int i=0;
return [self nthToLast:k withHead:head andCounter:&i];
}
只是出于好奇,你为什么要在Obj-C中这样做?你可以用C++编译。我这样问是因为你似乎不太懂通过引用传递还是指针传递。此外,如果您确实希望在Obj-C中执行此操作,您仍然可以执行按引用传递 在任何情况下,您的代码都有一些问题:
- 由于已改为使用指针,因此需要传递地址 我的李>
- 由于您现在使用的是指针,因此必须取消引用, 增量,并重新分配增量
- 你没有复制这个例子
正确编码并使用
而不是head
head->next
- (Node *)nthToLast:(int)k withHead:(Node *)head andCounter:(int *)i {
// If Node is an Obj-C class, then use nil
// If Node is a C++ struct/class then use NULL
// If you have c++11 and it is a C++ struct/class use nullptr
if (head == nil) {
return nil;
}
Node *nd = [self nthToLast:k withHead:head->next andCounter:i];
// I've pulled the value in count to make it clear what is being done
// i++ is pointer arithmetic, which is not what you want to do here
int count = *i;
++count;
*i = count;
if (count == k) {
return head;
}
return nd;
}
- (Node *)nthToLast:(int)k withHead:(Node *)head {
int i=0;
return [self nthToLast:k withHead:head andCounter:&i];
}
一小时后,我发现了同样的情况。让我们看看我是否能在你的工作模式中解释这一点 循环的直接问题是传入i的地址,然后使用该值,就好像它是变量的值一样。因此,您在随机地遍历内存,一次一个单词,查找恰好等于k的单词。这不太可能发生。相反,试试看
i* = i* + 1;
if (i* == k) {
...
或者将其折叠为:
if (++(i*) == k) return head;
我假设您可以在无需进一步帮助的情况下解决该头部->下一个问题
如果您确实使用了print语句,那么您应该在内部调用中看到一个明显的效果:i的“值”应该是一个很大的数量级,在每次迭代中增加4。当你认为你在递增时,4的步长是一个巨大的暗示,表明你已经进入了指针运算。一小时后,我发现了同样的情况。让我们看看我是否能在你的工作模式中解释这一点 循环的直接问题是传入i的地址,然后使用该值,就好像它是变量的值一样。因此,您在随机地遍历内存,一次一个单词,查找恰好等于k的单词。这不太可能发生。相反,试试看
i* = i* + 1;
if (i* == k) {
...
或者将其折叠为:
if (++(i*) == k) return head;
我假设您可以在无需进一步帮助的情况下解决该头部->下一个问题
如果您确实使用了print语句,那么您应该在内部调用中看到一个明显的效果:i的“值”应该是一个很大的数量级,在每次迭代中增加4。当您认为自己在递增时,4的步长是一个巨大的提示,表明您已经进入了指针算法。欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。适用于这里。在您发布代码并准确描述问题之前,我们无法有效地帮助您。最值得注意的是,我们无法从屏幕截图中重现您的问题。廉价调试提示:在每个例程的顶部插入打印语句。打印例程名称和所有参数。为了跟踪无限递归,还包括一个全局计数器:在每次打印时递增,并在达到有用的限制时中止程序(这里应该有50个)。谢谢你,这是一个好主意。我会试试:)欢迎来到StackOverflow。请阅读并遵循帮助文档中的发布指南。适用于这里。在您发布代码并准确描述问题之前,我们无法有效地帮助您。最值得注意的是,我们无法从屏幕截图中重现您的问题。廉价调试提示:在每个例程的顶部插入打印语句。打印例程名称和所有参数。为了跟踪无限递归,还包括一个全局计数器:在每次打印时递增,并在达到有用的限制时中止程序(这里应该有50个)。谢谢你,这是一个好主意。我试试看:)