美文网首页
数据结构--单链表

数据结构--单链表

作者: Bean_Nan | 来源:发表于2017-04-15 21:48 被阅读0次

    插入,删除,反转

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct Node {
        int data;
        struct Node *next;
    }Node, *LinkedList;
    //插入方法
    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) {//双重保证 避免了index超出范围
            current_node = current_node->next;
            count++;
        }
        if (count == index - 1) {//确保能到了指定结点前一个结点
            node->next = current_node->next;
            current_node->next = node;
        }
        return head;
    }
    
    //删除结点
    LinkedList delete_node(LinkedList head, int index) {
        //1如果头结点为空的话
        if (head == NULL) {
            return head;
        }
        //2如果删除头结点
        if (index == 0) {
            head = head->next;
            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 *delete_node = current_node->next;
            current_node->next = delete_node->next;
            free(delete_node);
        }
    
        return head;
    }
    //链表反转
    LinkedList reverse(LinkedList head) {
        if (head == NULL) {
            return head;
        }
        Node *current_node, *next_node; //一个是用来保存当前遍历的结点 一个是用来存储当前遍历结点的下一个结点
        current_node = head->next; //首先移动到第2个结点
        head->next = NULL;//将首结点的下一个结点设置为空
    
        while (current_node != NULL) {
            next_node = current_node->next;//将当前结点的下一个结点保存起来
            current_node->next = head;//将当前结点的下一个结点设置为头结点
            head = current_node;//将头结点设置为当前结点
            current_node = next_node;//将当前结点进行更新
        }
    
        return head;
    }
    //链表内存的清空
    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);
        }
    }
     
    

    相关文章

      网友评论

          本文标题:数据结构--单链表

          本文链接:https://www.haomeiwen.com/subject/uusoattx.html