Objective 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中执行此操作,您仍然可以执行按引用传递 在任何情况下,您的代码都有一些问题: 由于已改为使用指针,因此需要传递地址 我的 由于您现在

我正在解决这个问题,以返回单个链接列表最后一个元素的第k个元素

我试图实现这个通过引用传递值的C解决方案。并在目标C中通过指针进行传递

目前代码无限运行,我不确定在目标C中是否可以通过指针传递

首先是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个)。谢谢你,这是一个好主意。我试试看:)