链表初识

这篇博客详细介绍了链表数据结构的基础操作,包括如何创建链表、在指定位置插入节点、遍历链表打印所有元素、按索引删除节点以及如何反转链表。这些基本操作是理解链表和实现相关算法的关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链表

一、创建链表

  • 首先定义一个结构体node存储数据和指向下一个链表的指针next
  • 定义清空的函数,先定义一个指针,让它指向head
  • 通过current_node不断指向后一个节点来遍历整个链表
  • 定义deleted来保存当前的节点,之后让current_node指向后一个节点
  • 最后释放deleted_node指向的内存空间
typedef struct Node{
    int data;
    struct Node *next;
}Node, *LinkedList;
void clear(LinkedList head) {
    Node *current_node = head;
    while (current_node != NULL) {
        Node *delete_node = current_node;
        current_node = current_node->next;
        free(delete_node);
    }
}

二、链表的插入

  • 如果链表原为空,传入的指针即为链表的头元素,head即为node
  • 如果链表要插入的元素为首地址
  • 接下来,定义current_node储存头元素,遍历到所要插入的位置
  • 将要插入的元素插入,返回头元素
LinkedList insert(LinkedList head, Node *node, int index) {
    if (head == NULL) {
        if (index != 0) {
            return head;
        }
        head = node;
        return head;
    }
    if (index == 0) {
        node->next = head;
        head = node;
        return head;
    }
    Node *current_node = head;
    int count = 0;
    while (current_node->next != NULL && count < index - 1) {
        current_node = current_node->next;
        count++;
    }
    if (count == index - 1) {
        node->next = current_node->next;
        current_node->next = node;
    }
    return head;
}

三、遍历链表

  • 定义一个current_node指针,用while循环遍历链表
void output(LinkedList head){
    if(head == NULL){
        return;
    }
    Node *current_node = head;
    while(current_node != NULL){
        printf("%d ",current_node->data);
        current_node = current_node->next;
    }
    printf("\n");
}

四、链表删除

  • 遍历链表,定义一个返回值为Linkedlist类型的函数deleted_node,找到要删除的index
LinkedList deleted_node(LinkedList head,int index){
    if(head == NULL){
        return head;
    }
    Node *current_node = head;
    int count = 0;
    if(index == 0){
        head = head->next;
        free(current_node);
        return head;
    }
    while(current_node->next!=NULL && count<index-1){
        current_node = current_node->next;
        count++;
    }
    if(count == index-1  && current_node->next!=NULL){
        Node *deleted_node = current_node->next;
        current_node->next = deleted_node->next;
        free(deleted_node);
    }
    return head;
}

五、链表反转

  • 定义current_node,next_node指向头结点和下一节点
  • next_node指向头结点下一节点,head断开下一节点
  • 遍历整个链表,用current_node记录next_node的下一节点,next_node指向head
  • head = next_node next_node = current_node,继续向后遍历
LinkedList reverse(LinkedList head){
    if(head==NULL){
        return head;
    }
    Node *current_node,*next_node;
    next_node = head->next;
    head->next = NULL;
    while(next_node != NULL){
        current_node = next_node->next;
        next_node->next = head;
        head = next_node;
        next_node = current_node;
    }
    return head;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值