我来自Swift背景。我正在尝试在Objective C中实现一个单独的链表来进行练习......
这是我的代码:
#import <Foundation/Foundation.h>
#import "LinkedList.h"
@implementation LikedList
Node *head;
- (void)insert:(NSString *)value{
if (head == nil){
NSLog(@"*** Inserted value at head!");
Node *node = [[Node alloc] init: value];
head = node;
} else {
Node *currentNode;
currentNode = head;
while (currentNode.next != nil) {
currentNode = currentNode.next;
}
Node *newNode = [[Node alloc] init: value];
currentNode.next = newNode;
}
[self printLinkedListElements];
}
-(void) printLinkedListElements{
Node *currentNode = head;
int iterator = 0;
while (currentNode != nil){
iterator = iterator + 1;
NSLog(@"The iteration number is: %d", iterator);
NSLog(@"%@\n", currentNode.value);
currentNode = currentNode.next;
}
NSLog(@"***********************************");
}
@end
在我的insert
方法中,我首先检查头部是否为空。当我输入self.head == nil
,head == nil
当我输入self.head == nil
时,我会收到以下日志:
***在头部插入值!
迭代次数为:1
ValueOne
***在头部插入值!
迭代次数为:1
ValueTwo
***在头部插入值!
迭代次数为:1
ValueThree
***在头部插入值!
迭代次数为:1
ValueFour
***在头部插入值!
迭代次数为:1
ValueFive
但是,当我输入head == nil
时,我会得到我想要的结果:
***在头部插入值!
迭代次数为:1
ValueOne
***迭代次数为:1
ValueOne
***迭代编号为:2
ValueTwo
***迭代次数为:1
ValueOne
***迭代编号为:2
ValueTwo
***迭代次数为:3
ValueThree
***迭代次数为:1
ValueOne
***迭代编号为:2
ValueTwo
***迭代次数为:3
ValueThree
***迭代次数为:4
ValueFour
***迭代次数为:1
ValueOne
***迭代编号为:2
ValueTwo
***迭代次数为:3
ValueThree
***迭代次数为:4
ValueFour
***迭代次数为:5
ValueFive
在使用self.head == nil
而不是head == nil
时,能帮助我理解为什么我得到两个不同的输出?
答案 0 :(得分:1)
这里的问题是你已经声明了一个名为head
的全局变量:
@implementation LikedList
Node *head; // <-- THIS IS A GLOBAL VARIABLE
当您说head == nil
时,您指的是全局变量。当您说self.head
时,您指的是实例属性(您没有显示声明)。您永远不会分配给实例属性,因此查看其值始终返回nil。
据推测,您希望支持LikedList
的多个实例,因此您应该删除全局变量,并在任何地方使用self.head
,如下所示:
@implementation LikedList
- (void)insert:(NSString *)value{
if (self.head == nil){
NSLog(@"*** Inserted value at head!");
Node *node = [[Node alloc] init: value];
self.head = node;
} else {
Node *currentNode;
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;
int iterator = 0;
while (currentNode != nil){
iterator = iterator + 1;
NSLog(@"The iteration number is: %d", iterator);
NSLog(@"%@\n", currentNode.value);
currentNode = currentNode.next;
}
NSLog(@"***********************************");
}
@end