《算法通关村第一关——链表青铜挑战笔记》

什么是链表

        链表是一种常用的数据结构,今天我所学习的是单链表。

        即在线性表中,每个元素只有一个前驱元素与一个后续元素,用链式结构存储。链表的结构如下图所示:

        同时,链表满足关系一对一或者多对一,而不能有一对多的情况。

链表的构建
//构造链表(01234)
struct LinkNode* initLink(){
    //创建头指针
    struct LinkNode* p=NULL;
    //创建头节点
    struct LinkNode* temp=(struct LinkNode*)malloc(sizeof(struct LinkNode));
    temp->val=0;
    temp->next=NULL;
    //将头指针指向头节点
    p=temp;
    //将后面创建的节点用前驱指针指向他
    for(int i=1;i<5;i++){
        //创建一个节点
        struct LinkNode* a=(struct LinkNode*)malloc(sizeof(struct LinkNode));
        a->val=i;
        a->next=NULL;
        //节点指向指针
        temp->next=a;
        temp=temp->next;
    }
    return p;
};

创建链表即在元素的节点部分即数据域中赋值。而对链表进行操作还要用到其指针域。

打印链表
void printLinkNode(struct LinkNode* p){
    //定义一个指针遍历链表
    struct LinkNode* temp=p;
    //遍历输出
    while(t){
        printf("%d",temp->val);
        temp=temp->next;
    }
    printf("\n");
}
计算链表长度
int LengthLinkNode(struct LinkNode* p){
    //定义一个指针遍历
    struct LinkNode* t=p;
    int len=0;
    //遍历
    while(t){
        len++;
        t=t->next;

    }
    return t;
}
链表的插入

        链表的插入可以分为在表头,表中以及表末之分。

        在表头插入比较简单,即将head指向head->next,相当于跳过第一个元素。但这个时候我们需要一个新的node,使得node->next=head,之后便从node开始遍历整个链表。

        在表末插入也比较简单,只需要将尾节点指向新的节点

        当在表中插入时,我们首先需要定义一个newnode指向插入位置的那个节点,再将插入前一个节点指向newnode.

        即若要将newnode插入17前面,需将newnode先指向17,再将15指向newnode

struct LinkNode* insertNode(struct LinkNode* head,struct LinkNode* nodeInsert,int position){
    //当待插入节点是表头,或者不能插入时
    if(head==NULL){
        return nodeInsert;
    }
    //计算链表长度
    int len=LengthLinkNode(head);
    //判断不符合的情况
    if(position>len+1||position<1){
        printf("参数越界");
        return head;
    }
    //定义一个指针指向头指针
    struct LinkNode* pNode=head;
    //遍历链表,找到要插入的链表中的位置
    int num=1;
    while(num<position-1){
        pNode=pNode->next;
        num++;
    }
    nodeInsert->next=pNode->next;
    pNode->next=nodeInsert;
    return head;

};
链表的删除

        链表的删除,若是删除表头,只需要head=head->next,若是表尾的删除,只需要判断

cur->next=链表的最后一个元素,然后使cur->next=NULL。若是表中删除,需要将待删除元素position,使得cur->next=position->next

struct LinkNode* deledteNode(struct LinkNode*head ,int position){
    if(head==NULL){
        return NULL;
    }
    int len=LengthLinkNode(head);
    if(position>size||position<1){
        printf("Input error");
        return head;
    }
    //删除表头
    if(position==1){
        struct LinkNode* curNode=head;
        head=head->next;
        free(curNode);
        return head;
    }
    else{
        struct LinkNode*cur=head;
        int n=1;
        while(n=position-1){
            cur=cur->next;
            n++;
        }
        struct LinkNode*temp=cur->next;
        cur->next=temp->next;
        free(temp);
        return head;
    }
    
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值