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 ...
随机推荐
- 洛谷P3952 时间复杂度(模拟)
题意 题目链接 Sol 咕了一年的题解..就是个模拟吧 考场上写的递归也是醉了... 感觉一年自己进步了不少啊..面向数据编程的能力提高了不少 #include<bits/stdc++.h> ...
- Mavn 使用介绍
1 Maven介绍 1.1 项目开发中遇到的问题 1.都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 2.为什么在我的机器上可以正常打包,而配置管理员却打不出来? 3.项目 ...
- Java jsp 自定义标签
1 自定义标签 1.1 引入 需求: 向浏览器输出当前客户的IP地址 (只能使用jsp标签) 1.2 第一个自定义标签开发步骤 1)编写一个普通的java类,继承SimpleTagSupport类,叫 ...
- Python基础-模块与包
一.如何使用模块 上篇文章已经简单介绍了模块及模块的优点,这里着重整理一下模块的使用细节. 1. import 示例文件:spam.py,文件名spam.py,模块名spam #spam.py pri ...
- WebClient用法小结(转载)
如果只想从特定的URI请求文件,则使用WebClient,它是最简单的.NET类,它只用一两条命令执行基本操作,.NET FRAMEWORK目前支持以http:.https:.ftp:.和 file: ...
- Easyui datagrid加载数据时默认全选的问题
问题描述: 最近使用 Easyui datagrid 展示数据,之前一直使用很正常,今天出现了一个怪异问题 加载数据后,只要点击选中列 ck 的任意行或多行,再刷新时整个datagrid的所有数据都 ...
- 05_dubbo_aop
[对这行代码进行源码分析] ExtensionLoader<Protocol> loader = ExtensionLoader.getExtensionLoader(Protocol.c ...
- VC6.0创建DLL动态链接库四大要素
原文:http://blog.csdn.net/wanghaihao_1/article/details/51098451 要成功地编辑,编译和链接一个动态链接库,应该包括以下要素:建立工程文件,使用 ...
- Nancy使用Razor视图引擎时,提示对C:\Windows\temp 没有权限访问的问题
Nancy下使用Razor视图需要添加DLL文件引用,通过Nuget安装: 发布网站,在IIS上建立站点后,提示错误:对C:\Windows\temp\XXXX 的访问被拒绝(在VS里F5调试的时候没 ...
- dubbox源码分析(一)-服务的启动与初始化
程序猿成长之路少不了要学习和分析源码的.最近难得能静得下心来,就针对dubbox为目标开始进行源码分析. [服务提供方] 步骤 调用顺序 备注 容器启动 com.alibaba.dubbo.conta ...