亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

淺談iOS 數據結構之鏈表

2020-07-26 02:42:44
字體:
來源:轉載
供稿:網友

鏈表(Linked List)是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的,表現形式如下圖所示:

單鏈表

雙鏈表

數組和鏈表區別:

  • 數組:數組元素在內存上連續存放,可以通過下標查找元素;插入、刪除需要移動大量元素,比較適用于元素很少變化的情況
  • 鏈表:鏈表中的元素在內存中不是順序存儲的,查找慢,插入、刪除只需要對元素指針重新賦值,效率高

Objective-C 里沒有現成的鏈表結構,下面我實現了非線程安全的單鏈表和雙鏈表,以下都是具體的實現細節,完整代碼可以在這兒下載

單鏈表

單鏈表提供了插入、刪除、查詢、反轉等操作,具體實現如下:

BBSingleLinkedList.h

#import <Foundation/Foundation.h>@interface BBSingleLinkedNode : NSObject <NSCopying>@property (nonatomic, strong) NSString *key;@property (nonatomic, strong) NSString *value;@property (nonatomic, strong) BBSingleLinkedNode *next;- (instancetype)initWithKey:(NSString *)key      value:(NSString *)value;+ (instancetype)nodeWithKey:(NSString *)key      value:(NSString *)value;@end@interface BBSingleLinkedList : NSObject- (void)insertNode:(BBSingleLinkedNode *)node;- (void)insertNodeAtHead:(BBSingleLinkedNode *)node;- (void)insertNode:(BBSingleLinkedNode *)newNode beforeNodeForKey:(NSString *)key;- (void)insertNode:(BBSingleLinkedNode *)newNode afterNodeForKey:(NSString *)key;- (void)bringNodeToHead:(BBSingleLinkedNode *)node;- (void)removeNode:(BBSingleLinkedNode *)node;- (BBSingleLinkedNode *)nodeForKey:(NSString *)key;- (BBSingleLinkedNode *)headNode;- (BBSingleLinkedNode *)lastNode;- (NSInteger)length;- (BOOL)isEmpty;- (void)reverse;- (void)readAllNode;@end

BBSingleLinkedList.m

#import "BBSingleLinkedList.h"@implementation BBSingleLinkedNode- (instancetype)initWithKey:(NSString *)key      value:(NSString *)value{ if (self = [super init]) {  _key = key;  _value = value; } return self;}+ (instancetype)nodeWithKey:(NSString *)key      value:(NSString *)value{ return [[[self class] alloc] initWithKey:key value:value];}#pragma mark - NSCopying- (id)copyWithZone:(nullable NSZone *)zone{ BBSingleLinkedNode *newNode = [[BBSingleLinkedNode allocWithZone:zone] init]; newNode.key = self.key; newNode.value = self.value; newNode.next = self.next; return newNode;}@end@interface BBSingleLinkedList ()@property (nonatomic, strong) BBSingleLinkedNode *headNode;@property (nonatomic, strong) NSMutableDictionary *innerMap;@end@implementation BBSingleLinkedList- (instancetype)init{ self = [super init]; if (self) {  _innerMap = [NSMutableDictionary new]; } return self;}#pragma mark - public- (void)insertNodeAtHead:(BBSingleLinkedNode *)node{ if (!node || node.key.length == 0) {  return; }  if ([self isNodeExists:node]) {  return; }  _innerMap[node.key] = node; if (_headNode) {  node.next = _headNode;  _headNode = node; } else {  _headNode = node; }}- (void)insertNode:(BBSingleLinkedNode *)node{ if (!node || node.key.length == 0) {  return; }  if ([self isNodeExists:node]) {  return; }  _innerMap[node.key] = node;  if (!_headNode) {  _headNode = node;  return; } BBSingleLinkedNode *lastNode = [self lastNode]; lastNode.next = node;}- (void)insertNode:(BBSingleLinkedNode *)newNode beforeNodeForKey:(NSString *)key{ if (key.length == 0 || !newNode || newNode.key.length == 0) {  return; }  if ([self isNodeExists:newNode]) {  return; }  if (!_headNode) {  _headNode = newNode;  return; }  BBSingleLinkedNode *node = _innerMap[key]; if (node) {  _innerMap[newNode.key] = newNode;  BBSingleLinkedNode *aheadNode = [self nodeBeforeNode:node];  if (aheadNode) {   aheadNode.next = newNode;   newNode.next = node;  } else {   _headNode = newNode;   newNode.next = node;  }   } else {  [self insertNode:newNode]; //insert to tail }}- (void)insertNode:(BBSingleLinkedNode *)newNode afterNodeForKey:(NSString *)key{ if (key.length == 0 || !newNode || newNode.key.length == 0) {  return; }  if ([self isNodeExists:newNode]) {  return; }  if (!_headNode) {  _headNode = newNode;  return; }  BBSingleLinkedNode *node = _innerMap[key]; if (node) {  _innerMap[newNode.key] = newNode;  newNode.next = node.next;  node.next = newNode; } else {  [self insertNode:newNode]; //insert to tail }}- (void)removeNode:(BBSingleLinkedNode *)node{ if (!node || node.key.length == 0) {  return; } [_innerMap removeObjectForKey:node.key];  if (node.next) {  node.key = node.next.key;  node.value = node.next.value;  node.next = node.next.next; } else {  BBSingleLinkedNode *aheadNode = [self nodeBeforeNode:node];  aheadNode.next = nil; }}- (void)bringNodeToHead:(BBSingleLinkedNode *)node{ if (!node || !_headNode) {  return; }  if ([node isEqual:_headNode]) {  return; }  BBSingleLinkedNode *aheadNode = [self nodeBeforeNode:node]; aheadNode.next = node.next; node.next = _headNode; _headNode = node;}- (BBSingleLinkedNode *)nodeForKey:(NSString *)key{ if (key.length == 0) {  return nil; } BBSingleLinkedNode *node = _innerMap[key]; return node;}- (BBSingleLinkedNode *)headNode{ return _headNode;}- (BBSingleLinkedNode *)lastNode{ BBSingleLinkedNode *last = _headNode; while (last.next) {  last = last.next; } return last;}- (void)reverse{ BBSingleLinkedNode *prev = nil; BBSingleLinkedNode *current = _headNode; BBSingleLinkedNode *next = nil;  while (current) {  next = current.next;  current.next = prev;  prev = current;  current = next; }  _headNode = prev;}- (void)readAllNode{ BBSingleLinkedNode *tmpNode = _headNode; while (tmpNode) {  NSLog(@"node key -- %@, node value -- %@", tmpNode.key, tmpNode.value);  tmpNode = tmpNode.next; }}- (NSInteger)length{ NSInteger _len = 0; for (BBSingleLinkedNode *node = _headNode; node; node = node.next) {  _len ++; } return _len;}- (BOOL)isEmpty{ return _headNode == nil;}#pragma mark - private- (BBSingleLinkedNode *)nodeBeforeNode:(BBSingleLinkedNode *)node{ BBSingleLinkedNode *targetNode = nil; BBSingleLinkedNode *tmpNode = _headNode; while (tmpNode) {  if ([tmpNode.next isEqual:node]) {   targetNode = tmpNode;   break;  } else {   tmpNode = tmpNode.next;  } } return targetNode;}- (BOOL)isNodeExists:(BBSingleLinkedNode *)node{ BBSingleLinkedNode *tmpNode = _headNode; while (tmpNode) {  if ([tmpNode isEqual:node]) {   return YES;  }  tmpNode = tmpNode.next; } return false;}@end

雙鏈表

雙鏈表提供了插入、刪除、查詢操作,具體實現如下:

BBLinkedMap.h

#import <Foundation/Foundation.h>@interface BBLinkedNode : NSObject <NSCopying>@property (nonatomic, strong) NSString *key;@property (nonatomic, strong) NSString *value;@property (nonatomic, strong) BBLinkedNode *prev;@property (nonatomic, strong) BBLinkedNode *next;- (instancetype)initWithKey:(NSString *)key      value:(NSString *)value;+ (instancetype)nodeWithKey:(NSString *)key      value:(NSString *)value;@end@interface BBLinkedMap : NSObject- (void)insertNodeAtHead:(BBLinkedNode *)node;- (void)insertNode:(BBLinkedNode *)node;- (void)insertNode:(BBLinkedNode *)newNode beforeNodeForKey:(NSString *)key;- (void)insertNode:(BBLinkedNode *)newNode afterNodeForKey:(NSString *)key;- (void)bringNodeToHead:(BBLinkedNode *)node;- (void)readAllNode;- (void)removeNodeForKey:(NSString *)key;- (void)removeTailNode;- (NSInteger)length;- (BOOL)isEmpty;- (BBLinkedNode *)nodeForKey:(NSString *)key;- (BBLinkedNode *)headNode;- (BBLinkedNode *)tailNode;@end

BBLinkedMap.m

#import "BBLinkedMap.h"@implementation BBLinkedNode- (instancetype)initWithKey:(NSString *)key      value:(NSString *)value{ if (self = [super init]) {  _key = key;  _value = value; } return self;}+ (instancetype)nodeWithKey:(NSString *)key      value:(NSString *)value{ return [[[self class] alloc] initWithKey:key value:value];}#pragma mark - NSCopying- (id)copyWithZone:(nullable NSZone *)zone{ BBLinkedNode *newNode = [[BBLinkedNode allocWithZone:zone] init]; newNode.key = self.key; newNode.value = self.value; newNode.prev = self.prev; newNode.next = self.next; return newNode;}@end@interface BBLinkedMap ()@property (nonatomic, strong) BBLinkedNode *headNode;@property (nonatomic, strong) BBLinkedNode *tailNode;@property (nonatomic, strong) NSMutableDictionary *innerMap;@end@implementation BBLinkedMap- (instancetype)init{ self = [super init]; if (self) {  _innerMap = [NSMutableDictionary new]; } return self;}#pragma mark - public- (void)insertNodeAtHead:(BBLinkedNode *)node{ if (!node || node.key.length == 0) {  return; }  if ([self isNodeExists:node]) {  return; }  _innerMap[node.key] = node;  if (_headNode) {  node.next = _headNode;  _headNode.prev = node;  _headNode = node; } else {  _headNode = _tailNode = node; }}- (void)insertNode:(BBLinkedNode *)node{ if (!node || node.key.length == 0) {  return; }  if ([self isNodeExists:node]) {  return; }  if (!_headNode && !_tailNode) {  _headNode = _tailNode = node;  return; }  _innerMap[node.key] = node;  _tailNode.next = node; node.prev = _tailNode; _tailNode = node;}- (void)insertNode:(BBLinkedNode *)newNode beforeNodeForKey:(NSString *)key{ if (key.length == 0 || !newNode || newNode.key.length == 0) {  return; }  if ([self isNodeExists:newNode]) {  return; }  if (!_headNode && !_tailNode) {  _headNode = _tailNode = newNode;  return; }  BBLinkedNode *node = _innerMap[key]; if (node) {  _innerMap[newNode.key] = newNode;  if (node.prev) {   node.prev.next = newNode;   newNode.prev = node.prev;  } else {   _headNode = newNode;  }  node.prev = newNode;  newNode.next = node; } else {  [self insertNode:newNode]; //insert to tail } }- (void)insertNode:(BBLinkedNode *)newNode afterNodeForKey:(NSString *)key{ if (key.length == 0 || !newNode || newNode.key.length == 0) {  return; }  if ([self isNodeExists:newNode]) {  return; }  if (!_headNode && !_tailNode) {  _headNode = _tailNode = newNode;  return; }  BBLinkedNode *node = _innerMap[key]; if (node) {  _innerMap[newNode.key] = newNode;  if (node.next) {   newNode.next = node.next;   node.next.prev = newNode;  } else {   _tailNode = newNode;  }  newNode.prev = node;  node.next = newNode; } else {  [self insertNode:newNode]; //insert to tail }}- (void)bringNodeToHead:(BBLinkedNode *)node{ if (!node) {  return; } if (!_headNode && !_tailNode) {  _headNode = _tailNode = node;  return; }  if ([_headNode isEqual:node]) {  return; }  if ([_tailNode isEqual:node]) {  _tailNode = node.prev;  _tailNode.next = nil; } else {  node.prev.next = node.next;  node.next.prev = node.prev; }  _headNode.prev = node; node.next = _headNode; node.prev = nil; _headNode = node;}- (void)removeNodeForKey:(NSString *)key{ if (key.length == 0) {  return; }  BBLinkedNode *node = _innerMap[key]; if (!node) {  return; }  [_innerMap removeObjectForKey:key];  if ([_headNode isEqual:node]) {  _headNode = node.next; } else if ([_tailNode isEqual:node]) {  _tailNode = node.prev; }  node.prev.next = node.next; node.next.prev = node.prev; }- (void)removeTailNode{ if (!_tailNode || _tailNode.key.length == 0) {  return; }  [_innerMap removeObjectForKey:_tailNode.key]; if (_headNode == _tailNode) {  _headNode = _tailNode = nil;  return; }  _tailNode = _tailNode.prev; _tailNode.next = nil;}- (BBLinkedNode *)nodeForKey:(NSString *)key{ if (key.length == 0) {  return nil; } BBLinkedNode *node = _innerMap[key]; return node;}- (BBLinkedNode *)headNode{ return _headNode;}- (BBLinkedNode *)tailNode{ return _tailNode;}- (void)readAllNode{ BBLinkedNode *node = _headNode; while (node) {  NSLog(@"node key -- %@, node value -- %@", node.key, node.value);  node = node.next; }}- (NSInteger)length{ NSInteger _len = 0; for (BBLinkedNode *node = _headNode; node; node = node.next) {  _len ++; } return _len;}- (BOOL)isEmpty{ return _headNode == nil;}#pragma mark - private- (BOOL)isNodeExists:(BBLinkedNode *)node{ BBLinkedNode *tmpNode = _headNode; while (tmpNode) {  if ([tmpNode isEqual:node]) {   return YES;  }  tmpNode = tmpNode.next; } return false;}@end

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美制服第一页| 日本精品性网站在线观看| 日韩在线观看免费高清| 岛国av一区二区| 欧美午夜激情小视频| 欧美日韩福利视频| 91亚洲国产精品| 欧美成人中文字幕| 欧美日韩在线免费| 欧美日韩在线视频观看| 亚洲成人激情在线观看| 亚洲欧美日韩一区二区在线| 精品日韩美女的视频高清| 成人疯狂猛交xxx| 亚洲第一精品久久忘忧草社区| 91久久中文字幕| 亚洲视频在线观看网站| 国产一区二区三区直播精品电影| 91高清免费在线观看| 日韩中文字幕亚洲| 国产一区二区三区在线看| 亚洲xxxxx性| 欧美性生活大片免费观看网址| 亚洲欧美日韩第一区| 欧美日本高清一区| 欧美国产在线视频| 97精品久久久| 欧美激情视频免费观看| 欧美性极品xxxx做受| 亚洲欧美日韩成人| 欧美黄色成人网| 美乳少妇欧美精品| 色综合天天狠天天透天天伊人| 欧美在线视频一二三| 欧美国产第一页| 日韩国产中文字幕| 好吊成人免视频| 亚洲高清一区二| 中文国产成人精品| 日韩在线免费视频| 精品久久中文字幕久久av| 久久天堂av综合合色| 国产一区二中文字幕在线看| 亚洲国产欧美一区二区三区同亚洲| 亚洲精品999| 国产精品av在线播放| 韩国精品久久久999| 国产精品永久免费在线| 欧美成人亚洲成人日韩成人| 日本久久久久久久| 国产一区二区三区高清在线观看| 国产视频久久网| 91久久精品国产91性色| 日韩激情av在线播放| 亚洲精品少妇网址| 日韩欧美国产网站| 欧美中文字幕视频在线观看| 日本久久91av| 日韩国产欧美精品一区二区三区| 91精品视频专区| 激情懂色av一区av二区av| 91精品国产色综合久久不卡98口| 日韩在线视频导航| 日韩在线视频免费观看| 国产精品成人一区二区| 国产成人欧美在线观看| 欧美亚洲国产视频小说| 国产午夜精品麻豆| 久久久久免费视频| 亚洲精品色婷婷福利天堂| 97视频国产在线| 国内伊人久久久久久网站视频| 在线精品国产欧美| 国产精品一区二区久久久久| 日韩高清免费观看| 日韩av网站电影| 久久久999精品免费| 久久精品99久久香蕉国产色戒| 亚洲黄色av女优在线观看| 91免费版网站入口| 日韩激情片免费| 亚洲新中文字幕| 一个人看的www久久| 日韩欧美中文字幕在线观看| 亚洲va欧美va国产综合剧情| 精品国偷自产在线视频| 中文字幕免费国产精品| 欧美激情欧美狂野欧美精品| 欧美成人免费一级人片100| 亚洲a级在线观看| 国模极品一区二区三区| 久久久久久免费精品| 国产精自产拍久久久久久| 成人午夜高潮视频| 欧美性极品xxxx娇小| 日韩免费av一区二区| 国产成人在线精品| 欧美激情一区二区三区成人| 欧美午夜丰满在线18影院| 国产精品激情av在线播放| 国产精品爽爽ⅴa在线观看| 亚洲激情视频在线| 欧美精品免费在线观看| 欧美俄罗斯乱妇| 国产精品女主播视频| 深夜福利亚洲导航| 一区二区福利视频| 最近2019中文字幕一页二页| 欧美色道久久88综合亚洲精品| 国产精品日韩精品| 亚洲天堂色网站| 国产精品福利在线| 成人日韩av在线| 久久中文字幕视频| 亚洲国产精品99久久| 国产精品久久精品| 中文字幕国产日韩| 亚洲欧美一区二区三区情侣bbw| 欧美亚洲日本黄色| 这里只有精品久久| 日韩欧美999| 日韩av电影免费观看高清| 日韩免费观看av| 国产亚洲a∨片在线观看| 亚洲精品久久久久久久久| 亚洲91精品在线| 亚洲天堂免费视频| 国产成人精品视频| 国产激情久久久久| 亚洲天堂av电影| 欧美精品videosex极品1| 欧美激情一区二区三区在线视频观看| 日本中文字幕成人| 国产成人精品综合| 亚洲午夜未删减在线观看| 欧美日韩激情美女| 亚洲福利视频免费观看| www.午夜精品| 亚洲午夜精品视频| 欧美激情精品久久久久久蜜臀| 91综合免费在线| 91亚洲午夜在线| 欧美国产在线电影| 91精品免费视频| 亚洲精品国产精品久久清纯直播| 国产成人精品av在线| 亚洲图片欧美午夜| 亚洲伊人久久大香线蕉av| 亚洲高清一区二| 成人两性免费视频| 欧美亚洲在线播放| 国产日韩欧美一二三区| 欧美电影免费观看大全| 亚洲国产日韩一区| 欧美亚洲视频一区二区| 91精品国产乱码久久久久久久久| 91久久国产精品91久久性色| 亚洲va欧美va在线观看| 国产精品自拍视频| 亚洲a级在线观看| 韩日欧美一区二区| 中文欧美在线视频| 亚洲精品免费在线视频| 粗暴蹂躏中文一区二区三区|