波奇学数据结构:单链表

文章详细介绍了单链表的基础结构,包括其节点由val和next指针组成,以及如何实现链表的打印、尾部添加(PushbackSLT)、头部添加(PushfrontSLT)和删除(PopbackSLT,PopfrontSLT)等基本操作。同时,对比了单链表与顺序表的区别,强调了单链表在物理地址非连续、插入操作灵活性以及空链表处理上的特点。
摘要由CSDN通过智能技术生成

单链表的基本单位

val存储值,next指向下一个结构体的地址

struct ListNode
{
    int val;
    struct LisNode*next;
}

单链表的增删查改功能实现

链表打印

void PrintSLT(SLTNode*phead)
{
    SLTNode* cur = phead;//把首指针存入
    while (cur!=NULL)
    {
        printf("%d->", cur->data);
        cur = cur->next;//cur始终作为结构体地址
    }
    printf("NULL");
    printf("\n");
}

尾增

void PushbackSLT(SLTNode**pphead,SLTD new_data)
{
    SLTNode* phead = * pphead;
    //创建一个结构体变量返回它的指针
    //新结构体变量的data改为插入的数据并把next置空
    SLTNode* new_next = (SLTNode*)malloc(sizeof(SLTNode));
    if (new_next == NULL)
    {
        return;
    }
    new_next->data = new_data;
    new_next->next = NULL;
    //指针为空时,phead的值改为new_next,所以要传入二级指针
    if (phead == NULL)
    {
        *pphead = new_next;
        return;
    }
    //指针不为空
    SLTNode* tail = phead;
    //找到最后一个结构体的指针
    while (tail->next != NULL)
    {
        tail = tail->next;
    }
    tail->next = new_next;//最后一个结构体的指针位值更新为新指针位置
}

头增

void PushfrontSLT(SLTNode** pphead, SLTD new_data)
{
    SLTNode* cur = *pphead;
    SLTNode* new_next = (SLTNode*)malloc(sizeof(SLTNode));
    if (new_next == NULL)
    {
        return;
    }
    new_next->data = new_data;
    new_next->next = cur;
    *pphead = new_next;
}

尾删

void PopbackSLT(SLTNode** pphead)
{
    SLTNode* phead = *pphead;
    SLTNode* cur = phead;
    //没有结构体,不能删
    if (phead == NULL)
    {
        return;
    }
    //只有一个结构体,phead变成NULL,释放空间
    else if(phead->next==NULL)
    {
        free(phead);
        *pphead = NULL;
    }
    //有两个结构体
    //找到尾部的前一个
    else {
        while (cur->next->next != NULL)
        {
            cur = cur->next;
        }
        free(cur->next);
        cur->next = NULL;
    }
}

头增

//头删
void PopfrontSLT(SLTNode** pphead)
{
    SLTNode* phead = *pphead;
    //没有结构体
    if (phead == NULL)
    {
        return;
    }
    //只有一个时
    else if (phead->next == NULL)
    {
        free(phead);
        *pphead = NULL;
    }
    else {
        //大于一个时
        *pphead = phead->next;
        free(phead);
    }
}

单链表和顺序表的区别

顺序表物理地址连续的,单链表只是逻辑上连续实际上物理地址并不一定连续。顺序表如果头插或者中间插的话往往要进行数据覆盖,从而提高时间复杂度,而单链表只需要改变前驱节点就行。

单链表的节点可以为空,表示空链表。而顺序表结构体指针,不能为空。结构体指针为空表示没有开辟空间了。因此对顺序表结构体指针要断言,而单链表不用。但单链表二级指针要断言,理由同上。

单链表的特点

  1. 单向性,无法访问前面节点的值。比如要删除重复的值时,无法确定是否重复出现。

  1. 头节点无前驱节点,后节点后驱节点,造成要特殊讨论。如上面的头插。

解决这些问题:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值