数据结构篇---一文教你掌握链表!(记得做题噢)

1,表的实现分为数组和链表两种,对比一下优缺点。

对于表的操作分为:增删改查

①增:数组增加一个值需要两部:查找+后移   而链表只需要查找即可

②删:数组删除一个值需要两部:查找+前移  而链表只需要查找即可

这两种情况运行时间非常慢,并且需要已知数组大小;用链表实现最多妥当。

2,关于链表的简单demo实现

①链表节点的数据结构形式

struct Node{
    int val;
    struct Node* next;
};

②测试一个链表是否为NULL(带表头的空表)

Bool isEmpty(List L){
    return L->next == NULL;
}

③测试当前是否为链表的末尾

BOOL isLast(Position P,List L){
    return P->next == NULL;
}

④find例程

Positon Find(int x, List L){
    Position P;
    P = L->next;
    while(P != NULL && P->val != x){
        P = P->next;
    }
    return P;
}

⑤delete 例程

void Delete(int x, List L){
    Position P = Find(x, L);
    if(!isLast(P,L)){
        Position tmp = P->next;
        P->next = tmp->next;
        free(tmp);
    }else{
        free(P);
        P = NULL;
    }
}

⑥插入例程

void Insert(int val, List L, Position P){
    Position TempL = malloc(sizeof(struct Node));
    if(TempL == NULL){        
        print("error!");
    }
    TempL->val = val;
    Templ->next = P->next;
    P->next = TempL;
}

⑦删除链表

void Destory(List L){
    Position P, Tmp;
    P = L->next;
    L->Next = NULL;
    while(P != NULL){
        Tmp = P->next;
        free(P);
        P = Tmp;   
    }
}

3,链表的简单应用

①多项式ADT

f(x) = ax + bx + c

如何用链表来表示呢?

思想:定义一个数据结构: highval + nums[i]

highval表示最高幂    nums[i]表示从低到高各项系数的值(空为0)

多项式相加demo

#define MAXNUM 100

typede struct{
    int highval;
    int nums[MAXNUM+1];
}*Polynum;

void addPoly(Polynum Poly1,  Polynum Poly2, Polynum ans){
    int highval = fmax(Poly1->highval,  Poly2->highval);
    for(int i = highval; i >=0;i--){
        ans->nums[i]  = Poly1->nums[i] + Poly2->nums[i];   
    }
    ans->highval = highval;
}

多项式相乘demo

typede struct{
    int highval;
    int nums[MAXNUM + 1];
}* Polynum

void MulPoly(Polynum Poly1, Polynum Poly2, Polynum ans){
    ans->highval = Poly1->highval + Poly2->highval;
    
    if(highval > MAXNUM){
        return;
    }
    for(int i = Poly1->highval;i >= 0;i--){
        for(int j = Poly2->highval;j >= 0;j--){
            ans->nums[i+j] += Poly1->nums[i] + Poly2->nums[j];
        }
    }
}

②基数排序demo

首先先了解桶排序

这个排序原理非常简单!

①假设一个数据nums[100]元素  0 < nums[i] < 1000

②此时你就可以建立一个新的数组 hash[1000] = {0}

③遍历数组nums     hash[nums[i]] ++;

④然后再把hash数组打印出来

基数排序也不难,基就是你准备排序的准则,可以基于10进制,也可以基于16进制

至此,链表你应该就学明白啦,下面开始做题啦!

1,反转链表

2,反转链表Ⅱ

3,两数相加

4,随机链表的复制

5,环形链表Ⅱ

6,重排链表

7,LRU 缓存

8,删除链表中的重复元素

9,合并K的升序链表

10,K个一组翻转链表

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值