#线性表之链表


阅读目录

  • 为什么要使用链表
  • 链表的存储结构
  • 链表的常用操作代码实现

1.为什么使用链表

通过上一篇的学习,我们知道顺序表存在一些问题,主要有以下两个方面。

  • 顺序表的长度是固定的,如果超出分配的长度就会造成溢出,如果存放的数据太少则会造成空间浪费。
  • 在插入元素和删除元素时(尤其不在尾部时),会移动大量的元素,造成性能和效率低下。

基于以上问题,使用链表可以很好地避免顺序表中出现的问题。这也是我们要使用链表的原因。

2.链表的存储结构

单链表的存储结构.jpg

从上图可以看出,单链表中的每个结点都包含一个“数据域”和一个“指针域”。“数据域”中包含当前结点的数据,“指针域”包含下一节点的存储地址,头指针head是指向开始结点的,结束结点没有后继结点,所以结束结点的指针域为空,即null。

3.链表的常用操作及实现代码

链表常用的操作有:

1,插入结点到表头
思路:将head头指针的next指针给新增结点的next,然后将整个新增结点给head头指针的next。因此时间复杂度为O(1)。

示意图:
插入节点到表头.jpg

2,插入结点到表尾
思路:插入方法与插入到表头一样,只不过多一个步骤就是通过head头指针循环找到终端结点。因此时间复杂度为O(n)。

示意图:
插入节点到表尾.jpg

3,插入结点(1≤i≤ListLength(L))
思路:插入方法与插入到表头一样,多循环查找当前结点的动作。因此时间复杂度为O(n)。

示意图:
插入节点.jpg

4,删除结点
思路:同插入结点一样,时间复杂度为O(n)。

示意图:
删除节点.jpg

5,查找结点
思路:与插入结点和删除结点方法类似,时间复杂度为O(n)。

6,获取链表长度
思路:不像顺序表是连续存储的,获取表的长度非常容易。在链表中,数据不是连续存储的,因此需要循环遍历才能求得链表的长度,所以时间复杂度为O(n)。


实现代码(OC版):
Node.h文件

#import <Foundation/Foundation.h>
#import "Student.h"
@interface Node : NSObject
@property (nonatomic,strong)Student *data;//数据
@property (nonatomic,strong)Node *next; //指针
@end

@interface BllHelper: NSObject
+(Node *)InsertFirst:(Node *)linkList data:(Student *)data;
+(Node *)InsertEnd:(Node *)linkList data:(Student *)data;
+(Node *)Insert:(Node *)linkList key:(NSString *)name data:(Student *)data;
+(Node *)Delete:(Node *)linkList key:(NSString *)name;
+(Node *)GetNodeByName:(Node *)linkList key:(NSString *)name;
+(NSInteger)GetLinkLength:(Node *)linkList;
+(Node *)GetLastNode:(Node *)linkList;

@end

Node.m文件

#import "Node.h"

@implementation Node

-(NSString *)description
{
    Node *p = self;
    NSLog(@"学生名字:%@,年龄:% ld",p.data.name,p.data.age);

    while (p.next) {
        p = p.next;
        
        NSLog(@"学生名字:%@,年龄:% ld",p.data.name,p.data.age);
    }
    return nil;
}
@end

@implementation BllHelper

/**
 插入节点在表头
 */
+(Node *)InsertFirst:(Node *)linkList data:(Student *)data
{
    Node *first = [Node new];
    first.data = data;
    
    if (linkList == nil) {
        linkList = first;
        return linkList;
    }
    
    first.next = linkList;
    return  first;
}

/**
 插入节点在表尾
 */
+(Node *)InsertEnd:(Node *)linkList data:(Student *)data
{
    Node *endNode = [[Node alloc]init];
    endNode.data = data;
    endNode.next = nil;
    if (linkList == nil) {
        linkList = endNode;
        return linkList;
    }
    [self GetLastNode:linkList].next = endNode;
    return linkList;
}

/**
 插入结点(在包含关键字name的结点之后插入新的结点)
 */
+(Node *)Insert:(Node *)linkList key:(NSString *)name data:(Student *)data
{
    if (linkList == nil) {
        return nil;
    }
    if ([linkList.data.name isEqualToString:name]) {
        Node *tempNode = [Node new];
        tempNode.data = data;
        tempNode.next = linkList.next;
        linkList.next = tempNode;
    }
    [self Insert:linkList.next key:name data:data];
    return linkList;
}

/**
 删除结点(包含关键字name的结点)

 @param linkList <#linkList description#>
 @param name <#name description#>
 @return <#return value description#>
 */
+(Node *)Delete:(Node *)linkList key:(NSString *)name
{
    Node *p = linkList  , *w;
    while (p.next && ![p.data.name isEqualToString:name]) {
        w = p;
        p = p.next;
    }
    w.next = p.next;
    return linkList;
}

/**
 //查找结点(查找包含关键字name的结点)
 */
+(Node *)GetNodeByName:(Node *)linkList key:(NSString *)name
{
    Node *node;
    if (linkList == nil) {
        return nil;
    }
    if ([linkList.data.name isEqualToString:name]) {
        return linkList;
    }
    return [self GetNodeByName:linkList.next key:name];
    
}
// 获取节点的长度
+(NSInteger)GetLinkLength:(Node *)linkList
{
    NSInteger i = 1;
    Node *p = linkList;
    while (p.next) {
        p = p.next;
        ++i;
    }
    return i;
}
//获取最后一个节点
+(Node *)GetLastNode:(Node *)linkList
{
    Node *p = linkList;
    while (p.next) {
        p = p.next;
    }
    return p;
}
@end

main.m:

#import <Foundation/Foundation.h>
#import "Student.h"
#import "Node.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
   //
        Student *stu = [[Student alloc]init];
        stu.name = @"小明";
        stu.age = 22;
        Student *stu1 = [[Student alloc]init];
        stu1.name = @"小丽";
        stu1.age = 25;
        Student *stu2 = [[Student alloc]init];
        stu2.name = @"小王";
        stu2.age = 34;
        Student *stu3 = [[Student alloc]init];
        stu3.name = @"小涨";
        stu3.age = 34;
        
        Node *node;// = [Node new];
        NSLog(@"插入节点在表头");
        node= [BllHelper InsertFirst:node data:stu];
        node= [BllHelper InsertFirst:node data:stu1];
        node= [BllHelper InsertFirst:node data:stu2];
        
        NSLog(@"插入节点在表尾");
//        node = [BllHelper InsertEnd:node data:stu];
        NSLog(@"插入结点(在包含关键字key的结点之前插入新的结点)");
//        node = [BllHelper Insert:node key:@"小丽" data:stu3];
        
        NSLog(@"删除结点(删除包含关键字key的结点)");
//        node = [BllHelper Delete:node key:@"小丽"];
        NSLog(@"查找结点(查找包含关键字key的结点)");
//        node = [BllHelper GetNodeByName:node key:@"小丽"];
        NSLog(@"获取链表长度");
        
        NSLog(@"%lld",[BllHelper GetLinkLength:node ]);

        
        
        
        
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容