好久之前学习数据结构的时候写的,不是很完整,在这里备份一份笔记,有时间了继续补全。
使用OC实现一个单向单链表
1、节点类
#import <Foundation/Foundation.h>
@interface MMNode : NSObject
@property (nonatomic, assign) int data;//节点数据
@property (nonatomic, strong) MMNode *next;//下一个节点
@end
一个单链表节点包含存储数据和下一个节点的地址,这里直接存储了下一个节点。
2、单链表类
MMList.h
#import <Foundation/Foundation.h>
#import "MMNode.h"
@interface MMList : NSObject
@property (nonatomic, strong) MMNode *head;//首节点
@property (nonatomic, strong) MMNode *hail;//尾节点
//初始化
- (instancetype)initWithData:(int)data;
//增加节点
- (void)append:(int)data;
//输出
- (void)printList;
//指针反转
- (void)reverse;
@end
MMList.m
#import "MMList.h"
@implementation MMList
- (instancetype)initWithData:(int)data {
if (self = [super init]) {
//创建首节点
self.head = [[MMNode alloc] init];
self.head.data = data;
self.head.next = nil;
//设置尾节点
self.hail = self.head;//新初始化的链表,尾节点就是首节点
}
return self;
}
- (void)append:(int)data {
//创建新节点
MMNode *node = [[MMNode alloc] init];
node.data = data;
node.next = nil;
//之前的尾节点的next节点是现在新的节点
self.hail.next = node;
//将新节点设置成最新的尾节点
self.hail = node;
}
- (void)printList {
MMNode *current = self.head;
while (current) {
NSLog(@"%ld",(long)current.data);
current = current.next;
}
}
- (void)reverse {
MMNode *prev = nil;
MMNode *current = self.head;
MMNode *next = nil;
while (current) {
next = current.next;
current.next = prev;
prev = current;
current = next;
}
self.head = prev;
}
@end
这里实现了单链表的最基础的几个方法,增加数据、链表输出、链表指针反转。
测试
int main(int argc, const char * argv[]) {
@autoreleasepool {
MMList *list = [[MMList alloc] initWithData:0];
//刚初始化的链表,首节点即尾节点
NSLog(@"首节点数据:%@ ;尾节点:%@",list.head,list.hail);
//新增数据
for (int i = 1; i < 10; i++) {
[list append:i];
}
NSLog(@"首节点数据:%@ ;尾节点:%@",list.head,list.hail);
//输出
[list printList];
//逆转指针
[list reverse];
//再次输出
[list printList];
}
return 0;
}