再学一遍单链表

学习数据结构笔记:
本篇主要学习资源来自leetcode

单链表长什么样:

​ 值;链接到下一个结点的指针。

再学一遍单链表_第1张图片

节点定义:

// Definition for singly-linked list.
struct SinglyListNode {
     
    int val;
    SinglyListNode *next;
    SinglyListNode(int x) : val(x), next(NULL) {
     }
};

与数组的不同:

1.访问随机元素:链表在访问随机元素时,性能比较差。

​ 数组可以直接访问下标为i的元素。

​ 链表必须要从头节点挨个遍历,访问元素平均花时间为O(N)。

2.插入一个元素:插入非常高效

​ 时间复杂度:O(1)

​ 与数组不同,我们不需要将所有元素移动到插入元素之后。因此,您可以在 O(1) 时间复杂度中将新结点插入到链表中,这非常高效。

​ 只需要将要加入的节点的next字段只想要插入的下一个节点;插入位置之前的上一个节点的next只想要插入的节点。

img

插入结点的几种情况:

1.普通情况

​ 如上。

2.在开头添加结点

  1. 初始化一个新结点 cur

  2. 将新结点链接到我们的原始头结点 head

  3. cur 指定为 head

    例如,让我们在列表的开头添加一个新结点 9 。

    1. 我们初始化一个新结点 9 并将其链接到当前头结点 23 。

img

​ 2.指定结点 9 为新的头结点。

img

3.删除元素:

​ 时间复杂度:O(N)。

​ 空间复杂度:O(1)。

​ 因为删除元素我们需要找出 prev 和 next。使用 cur 的参考字段很容易找出 next,但是,我们必须从头结点遍历链表,以找出 prev,它的平均时间是 O(N),其中 N 是链表的长度。因此,删除结点的时间复杂度将是 O(N)。

​ 删除结点的几种情况:
​ 1.普通情况

​ 1. 从头遍历链表,直到我们找到前一个结点 prev

​ 2. 将 prevnext链接

​ 2.删除头结点

​ 如果想要删除第一个结点,我们可以简单地将下一个结点分配给 head

你可能感兴趣的:(数据结构与算法)