单链表-OC实现

单链表 (OC实现)

节点定义 .h文件

//结点
@interface LinkNode : NSObject
//data
@property (nonatomic, assign) int data;
//next
@property (nonatomic, strong, nullable) LinkNode *next;

- (instancetype)initWithData:(int)data;

@end

结点定义 .m文件

@implementation LinkNode
- (instancetype)initWithData:(int)data {
    self = [super init];
    if (self) {
        self.data = data;
        self.next = nil;
    }
    return self;
}
@end

单链表linkList定义

linkList.h文件

@interface LinkList : NSObject
//头结点
@property (nonatomic, strong, readonly) LinkNode *head;
//初始化
- (instancetype)initWithNode:(LinkNode *)node;
//删除
- (void)deleteLinkList:(int)index;
//定位
- (int)locationLinkList:(LinkNode *)node;
//读取元素
- (LinkNode *)getLinkList:(int)index;
//插入
- (void)insertLinkList:(int)data index:(int)index;
//求表长
- (NSInteger)lengthLinkList;

//建表 尾插法 头插法
- (void)createLinkList:(NSArray *)arr;

@end

linkList.m文件

@interface LinkList ()
@property (nonatomic, assign) NSInteger length;
@property (nonatomic, strong, readwrite) LinkNode *head;
@end

链表初始化

//初始化
- (instancetype)initWithNode:(LinkNode *)node {
    self = [super init];
    if (self) {
        self.length = 0;
        self.head = node;
    }
    return self;
}

建表 头插发

- (void)createLinkList:(NSArray *)arr {
    self.length = arr.count;
    for (int i = 0; i<arr.count; i++) {
        LinkNode *node = [[LinkNode alloc] initWithData:[arr[i] intValue]];
        node.next = self.head.next;
        self.head.next = node;
    }
}

删除操作

- (void)deleteLinkList:(int)index {
    if (index > self.length) {
        return;
    }
    int k = 1;
    LinkNode *p = self.head.next;
    while (p.next != nil && k != index-1) {//找到待删前驱
        p = p.next;
        k++;
    }
    LinkNode *d = p.next;
    p.next = d.next;
    self.length--;
}

插入

- (void)insertLinkList:(int)data index:(int)index {
    LinkNode *p = self.head.next;
    int k = 1;
    while (p.next != nil && k != index-1) {//找到待插入前驱
        k++;
        p = p.next;
    }
    if (k == index-1) {
        LinkNode *node = [[LinkNode alloc] initWithData:data];
        node.next = p.next;
        p.next = node;
    }
    self.length++;
}

读取元素

- (LinkNode *)getLinkList:(int)index {
    LinkNode *current = self.head.next;//首结点
    int k = 1;
    while (current.next != nil && k != index) {
        k++;
        current = current.next;
    }
    if (k == index) {
        return current;
    }
    return nil;
}

定位

- (int)locationLinkList:(LinkNode *)node {
    if (node == nil) {
        return -1;
    }
    int k = 1;
    LinkNode *current = self.head.next;//首结点
    while (current.next != nil && node.data != current.data) {
        k++;
        current = current.next;
    }
    if (current) {
        return k;
    }
    return -1;
}

求表长

- (NSInteger)lengthLinkList {
    return self.length;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文来自本人著作《趣学数据结构》 链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么...
    rainchxy阅读 3,804评论 6 20
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 6,046评论 0 13
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,415评论 0 25
  • 今天, 外面下起了雨, 我闭上眼睛, 竖起耳朵, 却听不见任何声音。 一切都很安静, 分针秒针也忘记了追逐, 整点...
    雅俗共赏Y阅读 144评论 -1 6
  • 看过太多为了融入集体而委屈自己的人,其实并没有谁非得让你改变,可你觉得自己倘若不改变就像是异类,然后呢为了融入环境...
    行空与少心的故事阅读 121评论 0 1