链表初识

链表

一、创建链表

  • 首先定义一个结构体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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这道题目是要求我们实现链表的基本操作,包括创建链表、插入节点、删除节点、遍历链表等。以下是一个简单的链表实现代码示例: ```c++ #include <iostream> using namespace std; // 定义链表节点结构体 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; // 创建链表 ListNode* createList(int nums[], int n) { if (n == 0) return NULL; ListNode *head = new ListNode(nums[0]); ListNode *cur = head; for (int i = 1; i < n; i++) { cur->next = new ListNode(nums[i]); cur = cur->next; } return head; } // 插入节点 void insertNode(ListNode *&head, int pos, int val) { if (pos < 0) return; if (pos == 0) { ListNode *newNode = new ListNode(val); newNode->next = head; head = newNode; return; } ListNode *cur = head; while (cur && pos > 1) { cur = cur->next; pos--; } if (cur) { ListNode *newNode = new ListNode(val); newNode->next = cur->next; cur->next = newNode; } } // 删除节点 void deleteNode(ListNode *&head, int pos) { if (pos < 0) return; if (pos == 0) { ListNode *delNode = head; head = head->next; delete delNode; return; } ListNode *cur = head; while (cur && pos > 1) { cur = cur->next; pos--; } if (cur && cur->next) { ListNode *delNode = cur->next; cur->next = delNode->next; delete delNode; } } // 遍历链表 void traverseList(ListNode *head) { while (head) { cout << head->val << " "; head = head->next; } cout << endl; } int main() { int nums[] = {1, 2, 3, 4, 5}; int n = sizeof(nums) / sizeof(int); ListNode *head = createList(nums, n); traverseList(head); insertNode(head, 2, 6); traverseList(head); deleteNode(head, 3); traverseList(head); return 0; } ``` 在上面的代码中,我们定义了一个 `ListNode` 结构体作为链表节点,包括节点值 `val` 和指向下一个节点的指针 `next`。同时,我们实现了创建链表、插入节点、删除节点和遍历链表等基本操作。在使用链表时,我们可以先通过 `createList` 函数创建一个链表,然后对链表进行插入、删除和遍历操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值