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 ...
随机推荐
- HDD 机械硬盘 安装 linux(centos7)
1. 下载 UltraISO 文件-->打开, 选中centos.iso镜像; 启动-->写入硬盘映像-->硬盘驱动器(选中u盘)写入方式(USB-HDD+v2)-->写入 ...
- git-中的命令与理解
改变到要操作仓库的目录创建文件夹(mkdir 文件夹名) git init初始化一个git仓库 git add .git add --all两个命令一样作用,添加目录里面所有文件到本地工作区 git ...
- Glide实现查看图片和保存图片到手机
两种方式, 推荐方式一 方式一 downloadOnly 创建一个 ImageActivity public class ImageActivity extends AppCompatActivity ...
- 在Ubuntu14.10中部署Hadoop2.6.0单节点伪分布集群
1. 环境信息如下: ubuntu:14.10 jdk:openjdk-1.7.0 hadoop:2.6.0 2. 下载hadoop2.6.0, http://apache.fayea.com/had ...
- java excel转pdf 工具类
package com.elitel.hljhr.comm.web.main.controller; import java.io.File; import java.io.FileOutputStr ...
- npm install warning: no description; no repository field
npm install 报错:warning no description; no repository field 开始以为必须npm init,npm init在git bash(win7)里,还 ...
- Python初学者第九天 字符串、列表、字典练习
# -*- coding: utf-8 -*-写代码,有如下字典,按要求实现每个功能dic={'k1':'v1','k2':'v2','k3':'v3'}1.请循环遍历出所有的key:dic={'k1 ...
- PHP error_log 实际运用
PHP的error_log()函数合理用起来还真方便呢,来看下这个函数: error_log(message,type,destination,headers); 参数 描述 message 必需.规 ...
- JQuery里ajax的表单传值serialize()用法
本文导读:在jQuery中,当我们使用ajax时,常常需要拼装 input数据以键值对(Key/Value)的形式发送到服务器,用JQuery的serialize方法可以轻松的完成这个工作 ...
- Linux下安装方法总结(源码安装)
很久之前安装过windows下以及Mac下的node,感觉还是很方便的,不成想今天安装Linux下的坑了老半天,特此记录. 首先去官网下载代码,这里一定要注意安装分两种,一种是Source Code源 ...