美文网首页
第四讲 链表

第四讲 链表

作者: 飞奔的小鲨鱼 | 来源:发表于2018-11-24 22:01 被阅读0次

链表

链表是一种常见的数据结构,链表中的数据是以节点表示的。每一个节点都有数据域(Data)和指针域(Next),数据域用来存放数据,指针域指向下一个节点。

节点示意图.png

这样节点一个一个的连接起来就构成了简单的链表,


简单链表.png

链表可以分为单向链表双向链表循环链表。我们先来看一下单向链表。

单向链表

插入节点


插入节点.png

主要代码实现:

节点
@interface XSYSingleNode : NSObject<NSCopying,NSMutableCopying>
@property (nonatomic, strong) id key;
@property (nonatomic, strong) id value;
@property (nonatomic, strong) XSYSingleNode * next;
+ (instancetype)nodeWithKey:(id)key value:(id)value;
- (instancetype)initWithKey:(id)key value:(id)value;
@end
@implementation XSYSingleNode
- (instancetype)initWithKey:(id)key value:(id)value{
    self.key = key;
    self.value = value;
    return [self init];
}

+ (instancetype)nodeWithKey:(id)key value:(id)value{
    return [[self alloc] initWithKey:key value:value];
}

- (instancetype)init{
    if (self = [super init]) {
        
    }
    return self;
}

- (id)copyWithZone:(NSZone *)zone{
    XSYSingleNode * node = [[XSYSingleNode allocWithZone:zone] init];
    node.key = self.key;
    node.value = self.value;
    node.next = self.next;
    return node;
}

- (id)mutableCopyWithZone:(NSZone *)zone{
    return [self copyWithZone:zone];
}
@end

- (void)insertNode:(XSYSingleNode *)node{
    if (!node || !node.key || !node.value) {
        return;
    }
    
    if (!_head) {
        _head = node;
    }
    else{
        XSYSingleNode * nod = _head;
        while (nod.next) {
          nod= nod.next;
        }
        nod.next = node;
        
    }
    _nodeDic[node.key] = node.value;
}

测试:

XSYSingleLinkedList * singleList = [XSYSingleLinkedList singleLinkedList];
    
    XSYSingleNode * firNode = nil;
    XSYSingleNode * delNode = nil;
    for (int i = 1; i < 6; i ++) {
        XSYSingleNode * node = [XSYSingleNode nodeWithKey:
[NSString stringWithFormat:@"%d",i] value:[NSString stringWithFormat:@"xsy_%02d",i]];
        [singleList insertNode:node];
        if (i == 1) {
            firNode = node;
        }
        else if(i == 3){
            delNode = node;
        }
    }

打印结果:

(
    "xsy_01",
    "xsy_02",
    "xsy_03",
    "xsy_04",
    "xsy_05"
)

删除节点


删除节点.png
- (BOOL)removeNode:(XSYSingleNode *)node{
    BOOL result = NO;
    if ([[_nodeDic allKeys] containsObject:node.key]) {
        result = YES;
        if (node.next) {
            node.key = node.next.key;
            node.value = node.next.value;
            node.next = node.next.next;
        }
        else{
            // 删除头结点
            _head = nil;
        }
        
        [_nodeDic removeObjectForKey:node];
        
    }
    return result;
}

测试:

    BOOL result1 = [singleList removeNode:firNode];
    NSLog(@"删除节点 --- %d",result1);
    BOOL result2 = [singleList removeNode:delNode];
    NSLog(@"删除节点 --- %d",result2); 
    NSLog(@"所有节点为 b--- %@",[singleList allNodes]);

打印结果:

删除节点 --- 1
删除节点 --- 1
所有节点为 b--- (
    "xsy_02",
    "xsy_04",
    "xsy_05"
)

相关文章

  • 第四讲 链表

    链表 链表是一种常见的数据结构,链表中的数据是以节点表示的。每一个节点都有数据域(Data)和指针域(Next),...

  • 常见算法总结

    链表 单链表反转链表中环的检测两个有序的链表合并删除链表倒数第 n 个结点求链表中间第n个节点

  • JZ-014-链表中倒数第 K 个结点

    链表中倒数第 K 个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点。题目链接: 链表中倒数第 K 个结点...

  • leecode刷题(21)-- 删除链表的倒数第N个节点

    leecode刷题(21)-- 删除链表的倒数第N个节点 删除链表的倒数第N个节点 描述: 给定一个链表,删除链表...

  • LeetCode-19-删除链表的倒数第N个节点

    LeetCode-19-删除链表的倒数第N个节点 题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的...

  • [22无验证]单向链表-七牛云2018秋

    1.题目描述 输入一个单向链表,输出该链表中倒数第k个节点,链表的倒数第1个节点为链表的尾指针。 比如链表为: 则...

  • 单向链表算法

    单向链表 反转单向链表 单链表查找倒数第k个节点 单链表递归倒序打印 单链表排序 单链表删除重复节点

  • 链表

    链表 单链表反转链表中环的检测两个有序链表合并删除链表倒数第n个节点求链表的元素总个数 一.单向链表 链表共有特征...

  • Swift 删除链表的倒数第N个节点 - LeetCode

    题目: 删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例: 说明...

  • Swift - LeetCode - 删除链表的倒数第N个节点

    题目 删除链表的倒数第N个节点 问题: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例:...

网友评论

      本文标题:第四讲 链表

      本文链接:https://www.haomeiwen.com/subject/fzlyqqtx.html