资源简介 (共21张PPT)二、 链表及其基本操作信息技术 选择性必修1 数据与数据结构第二章 数组与链表知识过关1. 链表的概念(1)链表指的是将需要处理的数据对象以节点的形式,通过指针串联在一起的一种数据结构。(2)每个节点一般包括两个区域:数据区域和指针区域。(3)每个链表有一个表头——head(也称头指针),是链表的入口,也便于循环链表在数据处理时的边界判断和处理。(4)链表的形式。链表的形式主要有单向链表、双向链表和循环链表。①单向链表:只有一个指针用来指向其后继节点。单向链表如图所示。②双向链表:有两个指针分别用于指向其前驱节点和后继节点。双向链表如图所示。③循环链表:第一个节点和最后一个节点使用指针链接。循环链表如图所示。2. 链表的特性(1)同一链表中每个节点的结构均相同,由数据区域和指针区域组成。(2)每个链表必定有一个头指针,以实现对链表的引用和边界处理。(3)链表占用的空间不固定。可根据需求增删节点,提高存储空间的利用率。3. 链表的基本操作(1)链表的创建。(2)链表节点的访问。链表只能通过头指针进行访问,其他节点通过节点间的指针依次访问。(3)链表节点的插入与删除。插入操作:插入datax节点删除data2节点(4)链表节点的访问与遍历。访问链表中的节点时,只能通过头指针进入链表并通过指针链接依次访问,直到找到目标位置上的节点。*4. 链表的类实现在Python中,链表除了可以使用列表来实现,还可以使用“类”来实现。“类”是一种抽象的数据结构,它将数据及其操作封装在一起。构造单向链表类的具体实现过程如下:(1)自定义单向链表的节点类:class Node: #定义单链表节点类 def_init_(self,data,next_=None):#初始化节点包含两个域self.data、self.next self.data=data #self.data域保存数据 self.next=next #self.next域保存指针,缺省值为None(2)构造单向链表类:class Link: #定义单向链表类Link def_init_(self): #初始化空链表 self._head=None #空链表头指针指向为空典例精选【例1】 下列关于链表的说法,错. 误. 的是( )A. 插入、删除操作不需要移动数据元素B. 增加或减少节点会改变链表占用的存储空间C. 可随机快速访问任何一个数据元素D. 同一链表中每个节点的结构均相同【解析】 可随机快速访问数据元素的是数组结构,原因是数组结构不仅在逻辑上相邻,其物理存储位置也相邻。但链表的物理存储位置可能是随机的,C符合题意。C【例2】 (2024·浙江6月选考)使用列表d模拟链表结构(节点数n>0),如图1所示,每个节点包含数据区域和指针区域,h为头指针。现要按链表顺序将这n个节点中的数据依次存放到d[0][0]、d[1][0]、…、d[n-1][0]中,最终保持节点链接关系不变,结果如图2所示。实现上述功能的Python程序段如下,方框中应填入的代码是( ) p,i = h,0 while p!=-1: tp = d[p][1] if p == i: i+= 1 elif p>i: d[i][0],d[p][0] = d[p][0],d[i][0] i+= 1 p = tp# 调整头指针h及指针区域,保持节点链接关系不变,代码略图2图1( )A. d[i][1] = d[p][1]d[p][1] = iB. d[p][1] = d[i][1]d[i][1] = pC. d[i][1] = pd[p][1] = d[i][1]D. d[p][1] = id[i][1] = d[p][1]B【解析】 本题考查链表的节点操作。根据题意可知,当前节点为p节点,p从头结点开始进行遍历。而变量i是从0开始顺序增加的,当p和i相等时,意味着链表是按链表顺序依次存放到d[0][0]、d[1][0]…d[n-1][0]的,即已经符合题意,此时只需依次进行简单的迭代即可。若p和i不相等,即数据的存放不符合题意,由于i是从0开始的,因此若p和i不等则肯定是p>i,此时由代码可知将节点i和节点p的数据域进行交换,由于在链表中p的位置比节点i更加靠前,即p→i。而数据交换后两者的关系刚好逆转了,即i→p,因此可以先删除节点i,然后将节点i插入到p节点的前面,这样即可实现题意,故先执行代码 d[p][1]=d[i][1],删除节点i,然后再将节点i指向节点p,故代码为d[i][1]=p。以此类推直到循环结束。至此,链表已实现按照顺序将这n个节点中的数据依次存放到d[0][0]、d[1][0]、…、d[n-1][0]中,但循环结束后,还需要修改头指针h的值,以及重新调整每个节点的指针域数据(即代码略部分)。B正确。【例3】 (2024·浙江1月选考)使用列表d模拟链表结构(节点数大于0),每个节点包含数据区域和指针区域,h为头指针。链表中各节点已按数据区域中数值的绝对值由小到大排列,如图1所示。现要修改该链表各节点的链接关系,使链表各节点按数据区域中的数值由小到大排列,结果如图2所示。实现该功能的程序段如下,方框中应填入的代码是( )t=hp=d[h][1]while p != -1 : q=d[p][1] p=qd[t][-1]=-1 图1 图2A. if d[p][0]>0: d[q][1]=p d[t][1]=qelse: d[h][1]=q h=pB. if d[p][0]>0: d[t][1]=q t=qelse: h=p d[p][1]=tC. if d[p][0]>0: d[t][1]=p t=pelse: d[p][1]=h h=pD. if d[p][0]>0: d[t][1]=q d[q][1]=pelse: d[p][1]=h h=qC( )【解析】 本题考查单链表及分支语句和数据排序等知识。由于数据区域中数值的绝对值由小到大排列,由代码可知,原先的节点关系是:t→p→q,若数据区域d[p][0]的数值为正数,则原链表节点关系不变,只需将各节点关系往下迭代即可,即:t变为p,p变为q即可。若数据区域d[p][0]的数值为负数,则原先的链表各节点关系需要重新指向,由于原数据是按照绝对值大小排序的,因此越往后面绝对值数越大,因此其相反数(负数)就越小,这样每一个当前节点p的负数肯定是当前链表中最小的数,因此该数应该变为最小的头节点,采用头插法可以实现,即将当前节点p的指针域指向原先的头节点h,然后再将头节点h变为当前节点p,C正确。自我检测1. 关于单向链表的节点结构,下列说法中错. 误. 的是( )A. 节点的数据区域用于存放实际需要处理的数据元素B. 节点的指针区域用于存放该节点相邻节点的存储地址C. 单向链表必须带有数据区域为空的头节点和尾节点D. 单向链表中的各个节点在内存中可以非顺序存储【解析】 单向链表的头尾节点一般情况下数据区域都不为空,是有效节点,C符合题意。C2. 有如下Python程序段:d=[[7,1],[8,2],[9,-1],[6,0]]head=3head=d[head][1]程序执行后,链表中共有几个节点( )A. 1 B. 2C. 3 D. 4【解析】 本题考查链表的知识。原链表有4个节点,经过代码“head=d[head][1]”操作后,头节点变为0,故节点数减少为3,C正确。C3. 下列关于链表的说法,正确的是( )A. 链表中的各元素在存储空间中的位置必须是连续的B. 链表中的表头元素一定存储在其他元素的前面C. 链表中的各元素在存储空间中的位置不一定连续,且各元素的存储顺序也是任意的D. 链表一旦创建好后,它的占用空间就是固定的【解析】 本题考查链表的基础知识。链表中的各元素在存储空间中的位置不一定连续,A错误。链表中的表头元素也可以在其他元素后面,B错误。链表一旦创建好后,其占用空间是可变的,比较灵活,D错误。C4. 有如下Python程序段:d=[[7,2],[5,4],[4,1],[9,-1],[1,3]]p=head=2while d[p][1]!=-1: print(d[p][0],end="->") p=d[p][1]执行该代码后,输出的结果是( )A. 4->5->1 B. 7-> 4->5->1->C. 4->5->1-> D. 4->5->1->9【解析】 本题考查链表的遍历。由于循环的条件是d[p][1]!=-1,也就是当前头指针p的下一个指针域不是最后一个(指针域为-1),则输出该数据域。因此这样输出,最后的9不能输出,C正确。C5. 有如下Python程序段:d=[[6,2],[4,3],[8,1],[2,-1]]p=head=0while p!=-1: print(d[p][0],end="->") p=d[p][1]执行上述语句后,程序输出结果为( )A.6->8->4-> B.6->8->4C.2->8->6->4 D.6->8->4->2->【解析】 列表d存储了一个单向链表,d[p][0]和d[p][1]分别是节点p的数据域和指针域,程序功能为从头节点开始遍历链表输出各节点的数据域的值,且这种遍历可以输出最后一项节点的数据2。D二、 链表及其基本操作1. 链表的概念(1)链表指的是将需要处理的数据对象以节点的形式,通过指针串联在一起的一种数据结构。(2)每个节点一般包括两个区域:数据区域和指针区域。(3)每个链表有一个表头——head(也称头指针),是链表的入口,也便于循环链表在数据处理时的边界判断和处理。(4)链表的形式。链表的形式主要有单向链表、双向链表和循环链表。①单向链表:只有一个指针用来指向其后继节点。单向链表如图所示。②双向链表:有两个指针分别用于指向其前驱节点和后继节点。双向链表如图所示。③循环链表:第一个节点和最后一个节点使用指针链接。循环链表如图所示。2. 链表的特性(1)同一链表中每个节点的结构均相同,由数据区域和指针区域组成。(2)每个链表必定有一个头指针,以实现对链表的引用和边界处理。(3)链表占用的空间不固定。可根据需求增删节点,提高存储空间的利用率。3. 链表的基本操作(1)链表的创建。(2)链表节点的访问。链表只能通过头指针进行访问,其他节点通过节点间的指针依次访问。(3)链表节点的插入与删除。插入操作:插入datax节点删除data2节点(4)链表节点的访问与遍历。访问链表中的节点时,只能通过头指针进入链表并通过指针链接依次访问,直到找到目标位置上的节点。*4. 链表的类实现在Python中,链表除了可以使用列表来实现,还可以使用“类”来实现。“类”是一种抽象的数据结构,它将数据及其操作封装在一起。构造单向链表类的具体实现过程如下:(1)自定义单向链表的节点类:class Node: #定义单链表节点类 def_init_(self,data,next_=None):#初始化节点包含两个域self.data、self.next self.data=data #self.data域保存数据 self.next=next #self.next域保存指针,缺省值为None(2)构造单向链表类:class Link: #定义单向链表类Link def_init_(self): #初始化空链表 self._head=None #空链表头指针指向为空【例1】 下列关于链表的说法,错误的是( C )A. 插入、删除操作不需要移动数据元素B. 增加或减少节点会改变链表占用的存储空间C. 可随机快速访问任何一个数据元素D. 同一链表中每个节点的结构均相同【解析】 可随机快速访问数据元素的是数组结构,原因是数组结构不仅在逻辑上相邻,其物理存储位置也相邻。但链表的物理存储位置可能是随机的,C符合题意。【例2】 (2024·浙江6月选考)使用列表d模拟链表结构(节点数n>0),如图1所示,每个节点包含数据区域和指针区域,h为头指针。现要按链表顺序将这n个节点中的数据依次存放到d[0][0]、d[1][0]、…、d[n-1][0]中,最终保持节点链接关系不变,结果如图2所示。实现上述功能的Python程序段如下,方框中应填入的代码是( B )图1 图2 p,i = h,0 while p!=-1: tp = d[p][1] if p == i: i+= 1 elif p>i: d[i][0],d[p][0] = d[p][0],d[i][0] i+= 1 p = tp# 调整头指针h及指针区域,保持节点链接关系不变,代码略A. d[i][1] = d[p][1]d[p][1] = iB. d[p][1] = d[i][1]d[i][1] = pC. d[i][1] = pd[p][1] = d[i][1]D. d[p][1] = id[i][1] = d[p][1]【解析】 本题考查链表的节点操作。根据题意可知,当前节点为p节点,p从头结点开始进行遍历。而变量i是从0开始顺序增加的,当p和i相等时,意味着链表是按链表顺序依次存放到d[0][0]、d[1][0]…d[n-1][0]的,即已经符合题意,此时只需依次进行简单的迭代即可。若p和i不相等,即数据的存放不符合题意,由于i是从0开始的,因此若p和i不等则肯定是p>i,此时由代码可知将节点i和节点p的数据域进行交换,由于在链表中p的位置比节点i更加靠前,即p→i。而数据交换后两者的关系刚好逆转了,即i→p,因此可以先删除节点i,然后将节点i插入到p节点的前面,这样即可实现题意,故先执行代码 d[p][1]=d[i][1],删除节点i,然后再将节点i指向节点p,故代码为d[i][1]=p。以此类推直到循环结束。至此,链表已实现按照顺序将这n个节点中的数据依次存放到d[0][0]、d[1][0]、…、d[n-1][0]中,但循环结束后,还需要修改头指针h的值,以及重新调整每个节点的指针域数据(即代码略部分)。B正确。【例3】 (2024·浙江1月选考)使用列表d模拟链表结构(节点数大于0),每个节点包含数据区域和指针区域,h为头指针。链表中各节点已按数据区域中数值的绝对值由小到大排列,如图1所示。现要修改该链表各节点的链接关系,使链表各节点按数据区域中的数值由小到大排列,结果如图2所示。实现该功能的程序段如下,方框中应填入的代码是( C )t=hp=d[h][1]while p != -1 : q=d[p][1] p=qd[t][-1]=-1 图1 图2A. if d[p][0]>0: d[q][1]=p d[t][1]=qelse: d[h][1]=q h=pB. if d[p][0]>0: d[t][1]=q t=qelse: h=p d[p][1]=tC. if d[p][0]>0: d[t][1]=p t=pelse: d[p][1]=h h=pD. if d[p][0]>0: d[t][1]=q d[q][1]=pelse: d[p][1]=h h=q【解析】 本题考查单链表及分支语句和数据排序等知识。由于数据区域中数值的绝对值由小到大排列,由代码可知,原先的节点关系是:t→p→q,若数据区域d[p][0]的数值为正数,则原链表节点关系不变,只需将各节点关系往下迭代即可,即:t变为p,p变为q即可。若数据区域d[p][0]的数值为负数,则原先的链表各节点关系需要重新指向,由于原数据是按照绝对值大小排序的,因此越往后面绝对值数越大,因此其相反数(负数)就越小,这样每一个当前节点p的负数肯定是当前链表中最小的数,因此该数应该变为最小的头节点,采用头插法可以实现,即将当前节点p的指针域指向原先的头节点h,然后再将头节点h变为当前节点p,C正确。1. 关于单向链表的节点结构,下列说法中错误的是( C )A. 节点的数据区域用于存放实际需要处理的数据元素B. 节点的指针区域用于存放该节点相邻节点的存储地址C. 单向链表必须带有数据区域为空的头节点和尾节点D. 单向链表中的各个节点在内存中可以非顺序存储【解析】 单向链表的头尾节点一般情况下数据区域都不为空,是有效节点,C符合题意。2. 有如下Python程序段:d=[[7,1],[8,2],[9,-1],[6,0]]head=3head=d[head][1]程序执行后,链表中共有几个节点( C )A. 1 B. 2C. 3 D. 4【解析】 本题考查链表的知识。原链表有4个节点,经过代码“head=d[head][1]”操作后,头节点变为0,故节点数减少为3,C正确。3. 下列关于链表的说法,正确的是( C )A. 链表中的各元素在存储空间中的位置必须是连续的B. 链表中的表头元素一定存储在其他元素的前面C. 链表中的各元素在存储空间中的位置不一定连续,且各元素的存储顺序也是任意的D. 链表一旦创建好后,它的占用空间就是固定的【解析】 本题考查链表的基础知识。链表中的各元素在存储空间中的位置不一定连续,A错误。链表中的表头元素也可以在其他元素后面,B错误。链表一旦创建好后,其占用空间是可变的,比较灵活,D错误。4. 有如下Python程序段:d=[[7,2],[5,4],[4,1],[9,-1],[1,3]]p=head=2while d[p][1]!=-1: print(d[p][0],end="->") p=d[p][1]执行该代码后,输出的结果是( C )A. 4->5->1 B. 7-> 4->5->1->C. 4->5->1-> D. 4->5->1->9【解析】 本题考查链表的遍历。由于循环的条件是d[p][1]!=-1,也就是当前头指针p的下一个指针域不是最后一个(指针域为-1),则输出该数据域。因此这样输出,最后的9不能输出,C正确。5. 有如下Python程序段:d=[[6,2],[4,3],[8,1],[2,-1]]p=head=0while p!=-1: print(d[p][0],end="->") p=d[p][1]执行上述语句后,程序输出结果为( D )A.6->8->4-> B.6->8->4C.2->8->6->4 D.6->8->4->2->【解析】 列表d存储了一个单向链表,d[p][0]和d[p][1]分别是节点p的数据域和指针域,程序功能为从头节点开始遍历链表输出各节点的数据域的值,且这种遍历可以输出最后一项节点的数据2。 展开更多...... 收起↑ 资源列表 二、 链表及其基本操作.docx 二、 链表及其基本操作.pptx