数据结构--链表

面试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/

你可能感兴趣的:(数据结构--链表)