当前位置: 首页 > news >正文

【LeetCode】链表练习 9 道题

第一题:移除链表元素

题目描述:

给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val == val的节点,并返回新的头节点 。

  • 列表中的节点数目在范围 [0, 10^4] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*///题目框架
struct ListNode* removeElements(struct ListNode* head, int val){
}

方法一:

利用链表删除的思路。定义一个prev和一个cur指针变量,如果cur指向的值不是valprevcur都向后移动;cur指向的值是val,就进行删除操作。但如果是第一个结点的删除,需要额外处理。
参考代码如下:

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* prev = NULL;struct ListNode* cur = head;while (cur != NULL){if (cur->val != val){prev = cur;cur = cur->next;}else//cur->val == val{//第一个结点的删除if (NULL == prev){head = cur->next;free(cur);cur=head;}else//中间结点的删除{prev->next = cur->next;free(cur);cur = prev->next;}}}return head;
}

方法二:

通过定义指针变量cur对给定的链表进行遍历,如果cur->val != val,就将该节点尾插到新链表;如果cur->val == val,就将该节点进行删除。
参考代码如下:

struct ListNode* removeElements(struct ListNode* head, int val)
{struct ListNode* cur = head;struct ListNode* tail = NULL;struct ListNode* del = NULL;head = NULL;while (cur != NULL){//插入情况if (cur->val != val){//头插情况if (NULL == tail){head = tail = cur;}else//尾插情况{tail->next = cur;tail = tail->next;}cur = cur->next;}else//删除情况{del = cur;cur = cur->next;free(del);del=NULL;}}if(tail != NULL){tail->next = NULL;}//返回新链表return head;
}

第二题:反转链表

题目描述:

给你单链表的头节点head,请你反转链表,并返回反转后的链表。

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*///题目框架
struct ListNode* reverseList(struct ListNode* head{
}

方法一:

直接颠倒节点指针指向进行反转。
定义三个指针变量prevcurnextprev记录cur的上一个节点,next记录cur的下一个节点。
参考代码如下:

struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* prev = NULL;struct ListNode* cur = head;struct ListNode* next = NULL;while (cur != NULL){next = cur->next;//进行指针指向的反转cur->next = prev;prev = cur;cur = next;}return prev;
}

第三题:链表的中间结点

题目描述:

给你单链表的头结点head,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。

  • 链表的结点数范围是 [1, 100]
  • 1 <= Node.val <= 100
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*///题目框架
struct ListNode* middleNode(struct ListNode* head){
}

方法一:

可以使用快慢指针来解决这道题。
可以定义一个快指针fast和一个慢指针slow,快指针一次走 2 步,慢指针一次走 1 步,当快指针走到结束,慢指针正好走到一半。
参考代码如下:

struct ListNode* middleNode(struct ListNode* head)
{struct ListNode* slow = head;struct ListNode* fast = head;//fast==NULL和fast->next==NULL,都代表走到结束位置while(fast != NULL && fast->next != NULL){slow = slow->next;fast = fast->next->next;}return slow;
}

第四题:链表中倒数第k个结点

这道题用的是牛客网的。

题目描述:

输入一个链表,输出该链表中倒数第k个结点。

/*** struct ListNode {*	int val;*	struct ListNode *next;* };*//*** * @param pListHead ListNode类 * @param k int整型 * @return ListNode类*///题目框架
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
}

方法一:

这道题也是可以使用快反指针的方法来解决。
定义一个快指针fast,定义一个慢指针slow,快指针先走k步,然后快指针和慢指针一起走,直到快指针走到结束,慢指针就走到倒数第k个位置。
参考代码如下:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
{struct ListNode* slow = pListHead;struct ListNode* fast = pListHead;//fast先走k步while (k--){//如果pListHead.length < k,出错返回NULLif(NULL == fast){return NULL;}fast = fast->next;}//fast走到NULL算结束while (fast != NULL){slow = slow->next;fast = fast->next;}return slow;
}

第五题:合并两个有序链表

题目描述:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*///题目框架
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
}

方法一:

要将两个链表合并为一个链表,可以尝试将其中一个链表中的所有值全部插入到另一个链表中。这种方法看似简单,但其实会有很多细节性的处理。
参考代码如下:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{//存在空链表的情况if (NULL == list1){return list2;}else if (NULL == list2){return list1;}//找出第一个结点值最小的链表,让其做被插入的链表struct ListNode* head = NULL;struct ListNode* cur = NULL;if ((list1->val) < (list2->val)){head = list1;cur = list2;}else{head = list2;cur = list1;}//cur链表节点不断插入到head链表struct ListNode* prev = head;struct ListNode* pnext = prev->next;//cur==NULL代表插入完成while (cur != NULL){//pnext!=NULL意味着在两个节点中间进行插入if (pnext != NULL){if ((cur->val) >= pnext->val){//不符合升序的条件,继续向后查找prev = prev->next;pnext = pnext->next;}else if ((cur->val) >= (prev->val) && (cur->val) <= (pnext->val)){//符合升序条件,进行插入prev->next = cur;prev = prev->next;cur = cur->next;prev->next = pnext;}}else //在链表尾进行插入{prev->next = cur;break;}}return head;
}

方法二:

可以采用归并的思想将两个链表归并到一个新链表之中。

//采用设置头结点的方式解决
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{struct ListNode* head = NULL;struct ListNode* tail = NULL;//头结点head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));while ((list1 != NULL) && (list2 != NULL)){if((list1->val) < (list2->val)){tail->next = list1;tail = tail->next;list1 = list1->next;}else{tail->next = list2;tail = tail->next;list2 = list2->next;}}if(NULL == list1){tail->next = list2;}else{tail->next = list1;}struct ListNode* fNode = head;head = head->next;free(fNode);fNode = NULL;return head;
}

第六题:链表分割

题目描述:

现有一链表的头指针ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*///题目框架
class Partition {
public:ListNode* partition(ListNode* pHead, int x) {}
};

方法一:

可以定义两个都带头结点的链表:lessHeadgreaterHead,将比x小的值尾插到lessHead的链表,比x大的值尾插到greaterHead的链表,最后将两个链表做一个链接。
参考代码如下:

class Partition {
public:ListNode* partition(ListNode* pHead, int x) {// write code herestruct ListNode* lessHead = NULL;struct ListNode* lessTail = NULL;struct ListNode* greaterHead = NULL;struct ListNode* greaterTail = NULL;lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* cur = pHead;while(cur!=NULL){if((cur->val) < x){lessTail->next = cur;lessTail = lessTail->next;cur = cur->next;}else {greaterTail->next = cur;greaterTail = greaterTail->next;cur = cur->next;}}lessTail->next = greaterHead->next;//需要将greaterTail作为合并后链表的尾结点,尾结点的next指针要置空greaterTail->next = NULL;struct ListNode* head = lessHead->next;free(lessHead);free(greaterHead);return head;}
};

第七题:回文链表

题目描述:

给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false

  • 链表中节点数目在范围[1, 10^5]
  • 0 <= Node.val <= 9
//题目框架
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
bool isPalindrome(struct ListNode* head){
}

方法一:

这道题可以结合链表查找中间结点和链表逆置来解决。将中间位置之后的节点都进行逆置,然后从两端遍历进行比较即可。
参考代码如下:

bool isPalindrome(struct ListNode* head)
{struct ListNode* slow = head;struct ListNode* fast = head;while(fast != NULL && (fast->next) != NULL){slow = slow->next;fast = fast->next->next;}struct ListNode* prev = slow;struct ListNode* cur = slow->next;struct ListNode* next = NULL;//相当于中间结点做两个链表的相交节点slow->next = NULL;while (cur != NULL){next = cur->next;cur->next = prev;prev = cur;cur = next;}//从两端开始比较while(prev != NULL){if(prev->val != head->val){return false;}prev = prev->next;head = head->next;}return true;
}

第八题:相交链表

题目描述:

给你两个单链表的头节点headAheadB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null
在这里插入图片描述

  • listA中节点数目为m
  • listB中节点数目为n
  • 1 <= m, n <= 3 * 10^4
  • 1 <= Node.val <= 10^5
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*///题目框架
struct ListNode* getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
}

方法一:

这道题有一个很妙的解法。先分别遍历A链表和B链表,求出A链表和B链表的长度。根据AB链表长度的差值,决定A或B先走差值步。然后A和B一起走,如果相遇,相遇的节点就是相交的第一个结点;如果走完了都没有相遇,说明A和B没有相交节点。
参考代码如下:

struct ListNode* getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{struct ListNode* curA = headA;struct ListNode* curB = headB;int countA = 0;int countB = 0;while (curA != NULL){++countA;curA = curA->next;}while (curB != NULL){++countB;curB = curB->next;}curA = headA;curB = headB;int count = 0;if (countA > countB){count = countA - countB;while(count--){curA = curA->next;}}else{count = countB-countA;while (count--){curB = curB->next;}}while (curA != NULL){if (curA == curB){return curA;}curA = curA->next;curB = curB->next;}return NULL;
}

第九题:复制带随机指针的链表

题目描述:

给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由n全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random`指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点
返回复制链表的头节点。

  • 0 <= n <= 1000
  • -10^4 <= Node.val <= 10^4
  • Node.randomnull或指向链表中的节点。
    在这里插入图片描述
/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*///题目框架
struct Node* copyRandomList(struct Node* head) {
}

方法一:

这道题有一个很妙的方法。在每一个节点后面都链接一个自己的copy节点,然后让copy->random=prevCopy->random->next,遇到NULL另作处理。最后把拷贝节点取下来,链接到一起,恢复原链表即可。
参考代码如下:

struct Node* copyRandomList(struct Node* head) 
{struct Node* cur = head;//节点的插入while (cur != NULL){struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->val = cur->val;newNode->next = cur->next;cur->next = newNode;cur = newNode->next;}//random指针的链接cur = head;struct Node* newCur = NULL;while (cur != NULL){newCur = cur->next;if (cur->random != NULL){newCur->random = cur->random->next;}else{newCur->random = NULL;}cur = newCur->next;}//新链表的取下cur = head;struct Node* newHead = NULL;struct Node* tail = NULL;while (cur != NULL){newCur = cur->next;cur->next = newCur->next;if (NULL == newHead){newHead = tail = newCur;}else{tail->next = newCur;tail = tail->next;}cur = cur->next;}return newHead;}

相关文章:

【LeetCode】链表练习 9 道题

第一题&#xff1a;移除链表元素 题目描述&#xff1a; 给你一个链表的头节点head和一个整数val&#xff0c;请你删除链表中所有满足Node.val val的节点&#xff0c;并返回新的头节点 。 列表中的节点数目在范围 [0, 10^4] 内1 < Node.val < 500 < val < 50 /…...

轴承远程监控系统解决方案

一、项目背景 随着现代机械设备朝着高集成、高精密度、系统化、自动化的方向发展&#xff0c;在工业生产中一旦机器发生故障&#xff0c;即使局部失灵&#xff0c;都可能导致设备工作失效&#xff0c;甚至造成整个自动化车间停产&#xff0c;从而给工业生产带来巨大的损失。轴承…...

阿里云轻量服务器Workbench root远程连接和一键连接的区别

阿里云轻量应用服务器远程连接支持Workbench root用户连接和Workbench一键连接&#xff0c;Workbench root需要输入root密码&#xff0c;一键连接不需要输入密码&#xff0c;但是也无法获得root权限&#xff0c;阿里云百科来详细说下阿里云轻量应用服务器远程连接说明&#xff…...

带你用纯C实现一个内存池(图文结合)

为什么要用内存池 为什么要用内存池&#xff1f;首先&#xff0c;在7 * 24h的服务器中如果不使用内存池&#xff0c;而使用malloc和free&#xff0c;那么就非常容易产生内存碎片&#xff0c;早晚都会申请内存失败&#xff1b;并且在比较复杂的代码或者继承的屎山中&#xff0c…...

ChatGPT使用案例之图像生成

ChatGPT使用案例之图像生成 这里一节我们介绍一下ChatGPT的图像生成&#xff0c;这里我们使用代码来完成&#xff0c;也就是通过API 来完成&#xff0c;因为ChatGPT 本身是不能生成图片的&#xff0c;言外之意我们图片生成是ChatGPT通过其他方式生成的 Images API提供了三种与…...

蚁群算法优化旅行问题

%%%%%%%%%%%%蚁群算法解决 TSP 问题%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%% clear all; %清除所有变量 close all; %清图 clc; %清屏 m 50; %蚂蚁个数 Alpha 1; %信息素重要程度参数 Beta 5; %启发式因子重要程度参数 Rho 0.1; %信息素蒸发系数 G 20…...

树数据结构

什么是树数据结构&#xff1f; 树数据结构是一种层次结构&#xff0c;用于以易于导航和搜索的方式表示和组织数据。它是由边连接的节点集合&#xff0c;节点之间具有层次关系。树的最顶端的节点称为根&#xff0c;它下面的节点称为子节点。每个节点可以有多个子节点&#xff0c…...

Spring Boot整合Redis并提供多种实际场景的应用

Spring Boot整合Redis并提供多种实际场景的应用1. 整合Redis2. 场景应用2.1 缓存2.2 分布式锁2.3 计数器2.4 发布/订阅3. 总结Spring Boot是一个快速构建基于Spring框架的应用程序的工具&#xff0c;它提供了大量的自动化配置选项&#xff0c;可以轻松地集成各种不同的技术。Re…...

VR全景图片,助力VR全景制作,720全景效果图

VR全景图片是指通过全景相机或多相机组合拍摄全景画面&#xff0c;并进行拼接处理生成全景图像的过程。VR全景图片的应用范围广泛&#xff0c;包括旅游和景区、房地产、汽车、艺术和文化、电影和娱乐等领域。本文将详细介绍VR全景图片的类型、应用场景、市场前景和发展趋势。 一…...

Kali Linux20款重要软件

Kali Linux 是一个流行的网络安全测试平台&#xff0c;它包含了大量的工具和应用程序&#xff0c;以下是其中20款最常用的软件和工具&#xff1a; Metasploit&#xff1a;Metasploit 是一个广泛使用的漏洞评估工具&#xff0c;可以帮助安全专业人员测试系统中的漏洞。Aircrack…...

C语言测试五

windows是什么类型的系统&#xff08;实时还是分时&#xff09;&#xff1f;有什么区别&#xff1f; 分时操作系统。如果在单核的情况下&#xff0c;分时操作系统多个进程共用一个单核&#xff0c;该单核会将其执行时间分成相应的时间片&#xff0c;每个进程占用一定的时间片&a…...

【微服务~原始真解】Spring Cloud —— 访问数据库整合Druid数据源

&#x1f50e;这里是【秒懂云原生】&#xff0c;关注我学习云原生不迷路 &#x1f44d;如果对你有帮助&#xff0c;给博主一个免费的点赞以示鼓励 欢迎各位&#x1f50e;点赞&#x1f44d;评论收藏⭐️ &#x1f440;专栏介绍 【秒懂云原生】 目前主要更新微服务&#xff0c;…...

前端入门必刷题,经典算法—两数之和

优美的前⾔ 年轻的码农哟~ 你是不是⼀直在思考⾃我提升的问题~ 思来想去&#xff0c;决定从算法抓起&#xff08;单押&#xff09;~ 拿起⼜放下&#xff0c;经历过多少次放弃&#xff08;单押 ✖ 2&#xff09;~ 决定了&#xff01;这次让我来帮你梳理&#xff08;单押 ✖ 3&a…...

‘海外/国外‘地区微博签到shu据(正题在第二部分)

最近失眠&#xff0c;研究了项关于weibo爬虫的新功能&#xff0c;种种原因&#xff0c;大家可跳过第一部分的引用直接看第二部分。 内容来源&#xff1a;健康中国、生命时报、央视等​​​​ 失眠标准一&#xff1a;3个“30分钟” ● 入睡困难&#xff0c;从躺下想睡到睡着间隔…...

Springboot——SB整合Mybatis的CURD(基于注解进行开发)

此处是根据需求实现基本操作 上面这里涉及到了条件分页查询&#xff0c;还有增加和批量删除员工信息&#xff0c;右边编辑就是先查询后更新操作&#xff0c;叫做查询回显&#xff0c;然后在原有基础上进行更新 环境准备 在下面的入门案例的整体环境下把数据库表换成empSpring…...

现在大专生转IT可行吗?

当然可行的。 大专也是人&#xff0c;为什么不可以选择喜欢的专业学习&#xff0c;现在大学生遍地都是&#xff0c;学历已经不是限制你发展的因素了。有的人就是不擅长理论学习&#xff0c;更喜欢技术。IT也只是一个普普通通的技术行业&#xff0c;跟其他技术行业一样&#xf…...

XC7A50T-1CSG324I、XC7A50T-2CSG324I Artix-7 FPGA可编程门阵列

Artix-7 FPGA能够在多个方面实现更高的性价比&#xff0c;这些方面包括逻辑、信号处理、嵌入式内存、LVDS I/O、内存接口&#xff0c;以及收发器。MicroBlaze CPU针对Xilinx FPGA进行了优化&#xff0c;是一种可高度配置的32位RISC处理器&#xff0c;可为微控制器、实时处理器和…...

linux安装图片处理软件ImageMagick

下载地址&#xff1a; wget https://download.imagemagick.org/archive/ImageMagick-7.1.1-4.tar.gz 或者 wget --no-check-certificate https://download.imagemagick.org/archive/ImageMagick-7.1.1-4.tar.gz 安装命令&#xff1a; tar -zxvf ImageMagick-7.1.1-4.tar.…...

【Java基础】JavaCore核心-反射技术

文章目录1.什么是反射技术2.反射-获取类对象方式3.反射-获取声明构造器4.反射-对象创建实战5.反射-方法和属性实战6.反射-属性值操作实战7.反射-invoke运行类方法1.什么是反射技术 Java的反射&#xff08;reflection&#xff09;机制是指在程序的运行状态中 可以构造任意一个类…...

AWGN后验估计下的均值与协方差关系(向量和标量形式)

文章目录AWGN信道向量模型后验均值与协方差的关系从实数域拓展到复数域小结AWGN信道向量模型 考虑一个随机向量x∼pX(x)\boldsymbol x \sim p_{\boldsymbol X}(\boldsymbol x)x∼pX​(x)&#xff0c;信道模型为 qxv,v∼N(0,Σ)\boldsymbol q \boldsymbol x \boldsymbol v, \…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...