OC实现 单向链表
需要实现一个消息队列,队列具有 FIFO 特点,即先入先出,在这里采用单向链表实现队列逻辑。
本次要实现的队列要求:
1. 节点可以存放任意类型数据
2. 线程安全
简单说明一下:
1. 创建CFNode类,用作节点,其data属性和next属性都是 atomic,即只能单线程访问属性。
2. 创建CFList类,用以push节点和pop节点
3. 删除操作为不必要操作,在这里实现了纯属个人技痒,同理可实现节点更新、插入等操作,在这里不做过多介绍。
CFList.h文件
//
// CFList.h
// ListTest
//
// Created by MiaoCF on 2018/2/26.
// Copyright © 2018年 MiaoCF. All rights reserved.
// #import <Foundation/Foundation.h> typedef BOOL(^CFComparator)(id obj1, id obj2); @interface CFNode : NSObject @property (atomic, strong) id data;
@property (atomic, strong) CFNode *next;
@end @interface CFList : NSObject @property (atomic, strong, readonly) CFNode *head;
@property (atomic, strong, readonly) CFNode *tail;
@property (atomic, assign, readonly) NSInteger size; // 1 creat
- (instancetype)initList; // 2 appendNode
- (void)appendData:(id)data; // 3 popNode
- (id)popNode; // 4 deleteNode
- (BOOL)deletNode:(CFNode *)node with:(CFComparator)comparator;// func equal to find node
@end
CFList.m文件
注意:
1. 使用了线程阻塞的互斥锁
2. 删除节点时,用户自己实现 CFComparator 进行比较。
3. 节点重复问题: 有多个节点数据相同 全部删除
//
// CFList.m
// ListTest
//
// Created by MiaoCF on 2018/2/26.
// Copyright © 2018年 MiaoCF. All rights reserved.
// #import "CFList.h" @implementation CFNode
@end @interface CFList()
@property (atomic, strong) NSLock *mutex;
@end @implementation CFList - (instancetype)initList { self = [super init]; _mutex = [[NSLock alloc] init]; self.head = nil;
self.tail = nil; return self;
} // idea: 记录 head 和 tail 节点, head只管删除节点, tail只管添加节点 - (void)appendData:(id)data {
[_mutex lock]; CFNode *node = [[CFNode alloc] init];
node.data = data;
node.next = nil; if (_head == nil) {
_head = node;
} else {
_tail.next = node;
}
_tail = node;
_size ++; [_mutex unlock];
} - (id)popNode {
[_mutex lock]; id res = nil; if (_head != nil) {
res = _head.data; CFNode *temp = _head;
_head = temp.next;
if (_head == nil) {
_tail = nil;
} temp.next = nil;
_size --;
} [_mutex unlock];
return res;
} // 节点重复问题: 有多个节点数据相同 如何处理? - (BOOL)deletNode:(CFNode *)node with:(CFComparator)comparator{ [_mutex lock]; //空链表
if (_head == nil) {
[_mutex unlock];
return NO;
} CFNode *currentNode = _head;
CFNode *previousNode = currentNode; //从第二个节点开始判断
while (currentNode) { if (comparator(currentNode, node)) { //移除节点 previousNode.next = currentNode.next;
currentNode.next = nil; // 节点重复问题: 有多个节点数据相同 全部删除
if (previousNode.next == nil) { // 一直遍历到末尾,可以清除重复节点 [_mutex unlock];
return YES;
}
}
previousNode = currentNode;
currentNode = currentNode.next; } [_mutex unlock];
return NO;
}
113 @end
OC实现 单向链表的更多相关文章
- 复习下C 链表操作(单向链表)
Object-C 作为C 的包装语言(运行时.消息机制).如果不熟悉C 的话实在玩得太肤浅. 随便深入oc 内部都会接触到C. runtime .GCD.Block.消息机制... 所有强大的功能无不 ...
- Reverse Linked List II 单向链表逆序(部分逆序)
0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...
- 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点
第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...
- 输出单向链表中倒数第k个结点
描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int m_nKey; ListNode* ...
- Linus:利用二级指针删除单向链表
Linus大神在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level codi ...
- 【转】Linus:利用二级指针删除单向链表
原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多, ...
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...
- 数据结构——Java实现单向链表
结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...
- 输入一个单向链表,输出该链表中倒数第K个结点
输入一个单向链表,输出该链表中倒数第K个结点,具体实现如下: #include <iostream> using namespace std; struct LinkNode { publ ...
随机推荐
- css-布局定位
position: ** 属性值 - absolute: *** 将对象从文档流中拖出 *** 可以是top.bottom等属性进行定位 - relative: *** 不会将对象从文档流中拖出 * ...
- QQ 聊天机器人小薇发布!
简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 QQ 群消息,发现有"感兴趣"的内容时通过图灵机器人进行智能回复 监 ...
- 【阿里云产品公测】性能测试服务PTS的初步尝试
性能测试服务PTS,对于像我这样对测试毫无概念的新手来说,这服务真的太好了,使用简单,官方教程又明细,连我这样的新手一看都明白了怎样使用. _%GGl$kH 下面是我来简单尝试一下,更多功 ...
- Github上600多个iOS开源项目地址
将Github上600多个iOS开源项目进行分类并且有相应介绍,小伙伴们快来看呀 地址:http://github.ibireme.com/github/list/ios/
- c++ inline 的位置不当导致的 无法解析的外部符号
这几天编写代码碰到 无法解析的外部符号 visual studio. 在类中 inline 修饰符应该放在类函数定义的时候而不是声明的地方 即 // test.h 头文件 class A { publ ...
- sudo:*:command not found
原因:执行sudo后,sudo会根据visudo里面配置的secure_path来找寻命令,所以sudo尽量使用绝对路径 sudo bash-c "echo $PATH"也可以看到 ...
- January 17 2017 Week 3 Tuesday
You can't shake hands with a clenched fist. 紧握拳头你就无法与他人握手. If you want to shake hands with others, j ...
- UI层实现
领域驱动设计实践 —— UI层实现 目录 1. User Interface 2. Controller 3. DTO 4. infrastructure层的公共组件 5. UI层类图 6. ...
- IntelliJ IDEA 2017 完美注册方法及破解方法
本文使用破解方式注册. 下载破解文件JetbrainsCrack-2.6.2.jar 下载地址: http://idea.lanyus.com/ 开始破解 一.将下载的 JetbrainsCrack- ...
- ADF中遍历VO中的行数据(Iterator)
在ADF中VO实质上就是一个迭代器, 1.在Application Module的实现类中,直接借助VO实现类和Row的实现类 TestVOImpl organizationUser = (TestV ...