链表基础

  • 定义:链表是通过指针串联在一起的线性结构,每个节点是由两部分组成,一个是数据域一个是指针域(存放下一个节点的指针),最后一个节点指向null。链表的入口点成为链表的头节点head。
    链表的类型:
  1. 单链表:单链表的节点只能指向节点的下一个节点。
  2. 双链表:每个节点有两个指针域,一个指向下一个节点,一个指向上一个节点;既可以向前查询也可以向后查询
  3. 循环链表:首尾相连,可以用来解决约瑟夫环问题。(0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。)
  • 链表的存储方式
    数组在内存中是连续分布的,但是链表不是,链表是通过指针域的指针链接在内存中的各个节点。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。
  • 链表的使用
  1. 链表的定义:
//单链表
struct ListNode{
  int val;//节点上存储的元素
  ListNode *next;//指向下一个节点的指针
  ListNode (int x) : val(x), next(NULL){})//节点的构造函数
};
  1. 初始化
ListNode* head = mew ListNode(5);
  1. 不自己定义构造函数,可以使用C++默认生成的构造函数,但是这个构造函数不会初始化任何变量
    使用默认构造函数初始化节点
ListNode* head = new ListNode();
head -> val = 5;//所以如果不定义构造函数使用默认构造函数的话,在初始化的时候就不能直接给变量赋值!
  • 链表操作
  1. 删除节点:只要将C节点的next指针 指向E节点就可以了。D节点依然存留在内存里,只不过是没有在这个链表里而已。,所以在C++里最好是再手动释放这个D节点,释放这块内存。其他语言例如Java、Python,就有自己的内存回收机制,就不用自己手动释放了。
  2. 添加节点:断开原来的指针指向添加的节点,新节点的指针指向原来节点
posted @ 2021-10-28 10:24  Ada_CN  阅读(56)  评论(0编辑  收藏  举报