通关村 单向链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、单向链表

链表的定义

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

初始化链表

struct ListNode* initLink() {
    //创建头节点
    struct ListNode *header = malloc(sizeof(struct ListNode));
    header->val = -1;
    header->next = NULL;
    //创建尾指针
    struct ListNode *pRear = header;
    for (int i = 1; i < 5; i++)
    {
        //创建新的节点
        struct ListNode *newnode = malloc(sizeof(struct ListNode));
        newnode->val = i;
        newnode->next = NULL;
        if (i == 1) {
            header->val = i;
        }
        else {
            pRear->next = newnode;
            pRear = newnode;
        }
    }
    return header;
}

遍历链表

void printlist(struct ListNode *header) {
    if (NULL == header)
    {
        return;
    }
    struct ListNode *pCurrent = header;
    while (pCurrent) {
        
        printf("%d\n", pCurrent->val);
        pCurrent=pCurrent->next;
    }
}

获取链表长度

int getListNodeLength(struct ListNode *header) {
    if (NULL == header)
    {
        return 0;
    }
    int length = 0;
    struct ListNode *pCurrent = header;
    while (pCurrent != NULL) {
        length++;
        pCurrent = pCurrent->next;
    }
    return length;
}

插入链表

struct ListNode* insertListNode(struct ListNode* header, struct ListNode* insertNode, int pos) {
    // 判断链表是否为空
    if (NULL == header) {
        // 为空直接返回插入链表
        return insertNode;
    }
    // 获取链表长度
    int size = getListNodeLength(header);
    // 判断插入的链表的位置是否越界
    if (pos > size + 1 || pos < 1) {
        printf("位置越界");
        return header;
    }
    // 头插
    if (pos == 1) {
        // 判断插入链表是否为空
        if (insertNode == NULL) {
            printf("插入节点为空");
            return header;
        }
        // 让插入链表指针指向下一个节点
        insertNode->next = header;
        // 更换头节点的数据
        header = insertNode;
        return header;
    }
    struct ListNode* pNode = header;
    int count = 1;
    // 循环找到插入前一个节点
    while (count < pos - 1 && pNode != NULL) {
        pNode = pNode->next;
        count++;
    }
    // 判断当前节点是否为空
    if (pNode == NULL) {
        printf("插入位置越界");
        return header;
    }
    // 判断插入节点是否为空
    if (insertNode == NULL) {
        printf("插入节点为空");
        return header;
    }
    // 插入的节点指向下一个节点
    insertNode->next = pNode->next;
    // 插入前一个的节点指向插入的节点
    pNode->next = insertNode;
    return header;
}

链表删除

struct ListNode* deleteNode(struct ListNode* header, int pos) {
    if (NULL == header) {
        return NULL;
    }
    int size = getListNodeLength(header);
    if (pos > size || pos < 1) {
        printf("位置越界");
        return header;
    }
    if (pos == 1) {
        return header->next;
    }
    else
    {
        //俩个辅助指针
        struct ListNode *pNode = header;
        struct ListNode *pCurrent = pNode->next;
        int count = 1;
        // 循环找到插入前一个节点
        while (count < pos - 1 && pNode != NULL) {
            pNode = pNode->next;
            count++;
        }        
        //重新建立待删除节点的前驱和后继结点关系
        pNode->next = pCurrent->next;
        //释放删除节点内存
        free(pCurrent);
        pCurrent = NULL;
    }
}

二、链表增加元素,首部,中部,尾部会出现的问题,怎么处理

增加元素到首部,头节点就要更换
增加元素要变更为头节点,并指向下一个节点
增加元素到中部,增加元素的前一个节点指向会出问题
前一个节点指向增加元素,增加元素的节点再指向前面的节点
增加元素到尾部,前一个节点指向是空,
前一个节点指向增加元素,增加元素指向空
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值