链表

数组的优势,在于可以方便的遍历查找需要的数据。在查询数组指定位置(如查询数组中的第4个数据)的操作中,只需要进行1次操作即可,时间复杂度为O(1)。但是,这种时间上的便利性,是因为数组在内存中占用了连续的空间,在进行类似的查找或者遍历时,本质是指针在内存中的定向偏移。然而,当需要对数组成员进行添加和删除的操作时,数组内完成这类操作的时间复杂度则变成了O(n)。

链表的特性,使其在某些操作上比数组更加高效。例如当进行插入和删除操作时,链表操作的时间复杂度仅为O(1)。另外,因为链表在内存中不是连续存储的,所以可以充分利用内存中的碎片空间。除此之外,链表还是很多算法的基础,最常见的哈希表就是基于链表来实现的。基于以上原因,我们可以看到,链表在程序设计过程中是非常重要的。本文总结了我们在学习链表的过程中碰到的问题和体会。

链表反转

//测试入口
int test() {
    //添加10个节点
    for (int i = 0; i < 10; i++) {
        struct ListNode *list = malloc(sizeof(struct ListNode));
        list -> ID = i;
        list -> data = i*100;
        list -> next = NULL;
        addList(list);
    }

    //链表反转------------------
    struct ListNode *nodePre = NULL;       //上一个节点
    struct ListNode *nodeCurr = list_head; //当前节点
    
    while (nodeCurr != NULL) {
        struct ListNode *next = nodeCurr -> next;
        //设置链表的头部
        if (next == NULL) {
            list_head = nodeCurr;
        }
        nodeCurr -> next = nodePre;
        //当前节点变成前一个节点
        nodePre = nodeCurr;
        //当前节点的下一个变成当前节点
        nodeCurr = next;
    }
    
   //打印顺序-------------------------
    struct ListNode *node = list_head;
    while (node -> next != NULL) {
        printf("%d\n",node -> ID);
        node = node -> next;
        if (node -> next == NULL) {
            printf("%d\n",node -> ID);
        }
    }
    
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容