数据结构--链表

面试C++常考的问题:链表和数组有什么区别呢?

1、链表是链式存储结构,数组是顺序存储结构。
2、链表通过指针连接元素与元素,而数组则是把所有元素按顺序进行存储。(就是说链表在内存可以不连续,数组则是连续存储的。)
3、链表的插入和删除元素比较简单,不需要移动元素,且较为容易实现长度的扩充,但是查询元素比较困难,数组是查询比较快,但是删除和增加会比较麻烦。(数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。)
4、数组在使用前需要固定大小,如果太小,会导致数组越界;如果太大,会造成内存资源浪费;而链表则能够动态分配内存,实现用多少申请多少
5、数组元素在栈区,链表元素在堆区;
6、数组使用完后系统自动释放空间,链表使用完后需要人为通过free释放空间;
7、数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n)(数组定位元素时可以根据下标直接定位,而链表则需要遍历,因此在定位元素时,数组优于链表)

所以。。。。什么是链表呢?直接上栗子!!

单向链表

单向链表中包含数据域和指针域,其中数据域用于存放数据,指针域用来连接当前结点和下一节点。

struct Node {
  int value;
  Node *next;
};

双向链表

双向链表中同样有数据域和指针域,不同之处在于指针域有左右(或上一个、下一个)之分,用来连接上一个节点、当前结点、下一个结点。

struct Node {
  int value;
  Node *left;
  Node *right;
};

一个简单的应用就是反转链表:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

假设链表为 1→2→3→∅,我们想要把它改∅←1←2←3。

在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* prev = nullptr;
        ListNode* curr = head;
        while (curr) {
            ListNode* next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
};

[参考链接]
https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/solution/fan-zhuan-lian-biao-by-leetcode-solution-jvs5/
https://www.html.cn/qa/other/21664.html
https://blog.csdn.net/weixin_30636089/article/details/97230131
https://oi-wiki.org/ds/monotonous-stack/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 点赞关注,不再迷路,你的支持对我意义重大!🔥 Hi,我是丑丑。本文「数据结构 & 算法」| 导读 —— 登高博见[...
    彭旭锐阅读 4,410评论 0 6
  • 一、基本概念 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的...
    王小鹏的随笔阅读 3,499评论 0 1
  • 动态数组存在明显的缺点:首先动态扩容可能会造成内存空间的大量浪费;使用链表这种数据结构就可以办到,使用多少内存,就...
    YanZi_33阅读 2,224评论 0 0
  •   链表和数组一样,都是用于储存一系列的元素(数据)的数据结构,但是链表和数组的实现机制完全不同,下面我们就来学习...
    凉寻阅读 2,548评论 0 0
  • 0. 序列 之前有一篇文章讲解了“动态数组”,以及通过这个“动态数组”实现了栈和队列,而这里的“动态数组”的底层其...
    付凯强阅读 4,427评论 5 7