You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift转Objective-C:单链表insert方法中self.head与head判断差异咨询

问题原因分析

哈哈,这个坑我刚从Swift转Objective-C的时候也踩过!本质是你搞混了全局变量和实例属性/实例变量的区别,咱们一步步说清楚:

1. 你代码里的head是全局变量,不是实例变量

你在@implementation LikedList(顺便提一句,这里你拼错成LikedList了,应该是LinkedList)下面直接写了Node *head;,这种写法在Objective-C里定义的是全局变量——整个程序里所有的LinkedList实例都会共享这一个head变量,而不是每个实例自己拥有独立的头节点。

2. self.head访问的是实例属性,和全局head完全无关

如果你能通过self.head编译运行,说明你肯定在LinkedList.h里声明了@property(nonatomic, strong) Node *head;。Objective-C会自动为这个属性做两件事:

  • 合成一个实例变量_head(默认是下划线开头,和属性名对应),这个变量是每个LinkedList实例独有的;
  • 生成对应的getter和setter方法,self.head本质是调用[self head]这个getter方法,返回的是当前实例的_head变量,和你那个全局的head没有任何关系!

3. 两种判断逻辑的差异拆解

用head == nil的情况

第一次插入时,全局变量head确实是nil,所以你创建新节点并赋值给全局head,之后这个全局变量就有值了。后续插入时,head == nil不成立,程序会遍历到链表末尾插入新节点,自然就能得到递增的链表,符合你的预期。

用self.head == nil的情况

你代码里赋值的是head = node;(全局变量),从来没给self.head对应的_head实例变量赋过值!所以每次调用insert时,self.head返回的都是nil,程序每次都会走if分支,输出头节点插入的日志,然后把全局head覆盖成新节点——之前的节点就被丢掉了,链表自然永远只有最后插入的那个元素。

怎么修正?

你需要把全局变量改成实例变量,并且统一操作同一个变量:

// 把全局变量放到@implementation的大括号里,变成实例变量(也可以直接用属性合成的_head)
@implementation LinkedList {
    Node *_head;
}

- (void)insert:(NSString *)value{
    if (self.head == nil){
        NSLog(@"*** Inserted value at head!");
        Node *node = [[Node alloc] init: value];
        self.head = node; // 赋值给属性,操作的是实例变量_head
    } else {
        Node *currentNode = self.head;
        while (currentNode.next != nil) {
            currentNode = currentNode.next;
        }
        Node *newNode = [[Node alloc] init: value];
        currentNode.next = newNode;
    }
    [self printLinkedListElements];
}

-(void) printLinkedListElements{
    Node *currentNode = self.head; // 统一用self.head访问
    int iterator = 0;
    while (currentNode != nil){
        iterator++;
        NSLog(@"The iteration number is: %d", iterator);
        NSLog(@"%@\n", currentNode.value);
        currentNode = currentNode.next;
    }
    NSLog(@"***********************************");
}
@end

这样所有操作的都是当前实例独有的头节点,就不会出现奇怪的覆盖问题了。

内容的提问来源于stack exchange,提问作者fja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:54:30