免费智能真题库 > 历年试卷 > 程序员 > 2019年下半年 程序员 上午试卷 综合知识
  第37题      
  知识点:   带头节点的单链表和不带头节点的单链表的区别   线性表的单链表存储结构
  关键词:   循环链表   链表        章/节:   常用数据结构       

 
单向循环链表如下图所示,以下关于单向循环链表的叙述中,正确的是(37) 。

 
 
  A.  仅设头指针时,遍历单向循环链表的时间复杂度是O(1)
 
  B.  仅设尾指针时,遍历单向循环链表的时间复杂度是O(1)
 
  C.  仅设头指针时,在表尾插入一个新元素的时间复杂度是O(n)
 
  D.  仅设尾指针时,在表头插入,个新元素的时间复杂度是O(n)
 
 
 

  相关试题:线性表          更多>  
 
  第34题    2021年上半年  
   100%
只能在线性表的表头删除元素、在表尾插入元素的数据结构称为 ( )。
  第40题    2009年下半年  
   53%
对具有n个元素的顺序表(采用顺序存储的线性表)进行(40)操作,其耗时与n的大小无关。
  第40题    2021年上半年  
   100%
( )是表示数据逻辑结构的术语。
   知识点讲解    
   · 带头节点的单链表和不带头节点的单链表的区别    · 线性表的单链表存储结构
 
       带头节点的单链表和不带头节点的单链表的区别
        带头节点的单链表和不带头节点的单链表的区别主要体现在其结构上和算法操作上。
        在结构上,带头节点的单链表不管链表是否为空,均含有一个头节点;而不带头节点的单链表不含头节点。
        在操作上,带头节点的单链表的初始化为申请一个头节点,且在任何节点位置进行的操作算法一致;而不带头节点的单链表让头指针为空,同时其他操作要特别注意空表和第一个节点的处理。下面列举带头节点的单链表插入操作和不带头节点的插入操作的区别。
        定义单链表的节点类型如下:
        
        1)带头节点的单链表插入函数insert(Slink *head, int i, ElemType x)
        带头节点的单链表插入函数的设计思想是:创建一个data域值为x的新节点*p,然后插入到head所指向的单链表的第i个节点之前。为保证插入正确有效,必须查找到指向第i个节点的前一个节点的指针,主要的时间耗费在查找上,因而在长度为n的线性单链表中进行插入操作的时间复杂度为On)。
        2)不带头节点的单链表插入函数insert(inti, ElemTypex
        不带头节点的单链表插入函数的设计思想是:创建一个data域值为x的新节点*p,然后插入到单链表的第i个节点之前。由于不带头节点,当插入位值i=1时,其算法与i>1时有很大差别,必须单独处理。为保证插入正确有效,必须查找到指向第i个节点的前一个节点的指针,主要的时间耗费在查找上,因而在长度为n的线性单链表中进行插入操作的时间复杂度为On)。
        可见,带头节点的单链表插入操作和不带头节点的插入操作在算法实现上有很大的区别,主要体现在初始化、能否插入成功的判别及插入时的操作上,在带头节点的单链表上插入在任何位置上都是相同的,而在不带头节点单链表的第一个节点和其他节点前插入操作是不同的。
        对于带头节点的单链表和不带头节点的单链表在其他操作上的区别可类似得到。
 
       线性表的单链表存储结构
        单链表中的每个节点由两部分组成:数据域和指针域。节点形式如下:
        
        其中,data部分称为数据域,用于存储线性表的一个数据元素(节点)。next部分称为指针域或链域,用于存放一个指针,该指针指向本节点所含数据域元素的直接后继所在的节点。若数据元素的类型用ElemType表示,则单链表的类型定义如下:
        
        单链表分为带头节点(其next域指向第一个节点)和不带头节点两种类型,由于头指针的设置使得对链表的第一个位置上的操作与在表其他位置上的操作一致,因而可简化运算的实现过程。
        在单链表上实现线性表基本运算的函数如下。
        1)初始化函数initlist(Slink *head)
        初始化函数用于创建一个头节点,由head指向它,该节点的next域为空,data域未设定任何值。由于调用该函数时,指针head在本函数中指向的内容发生改变,为了返回改变的值,因此使用了应用型参数,其时间复杂度为O(1)。初始化函数的语法如下:
        
        2)插入函数insert(Slink *head, int i, ElemType x)
        插入函数的设计思想是:创建一个data域值为x的新节点*p,然后插入到head所指向的单链表的第i个节点之前。为保证插入正确有效,必须查找到指向第i个节点的前一个节点的指针,主要的时间耗费在查找上,因而在长度为n的线性单链表进行插入操作的时间复杂度为On)。插入函数的语法如下:
        
        3)删除函数delete(Slink *head, int i, ElemType x)
        删除函数的设计思想是:线性链表中元素的删除要修改被删除元素前驱的指针,回收被删除元素所占的空间。主要的时间耗费在查找上,因而在长度为n线性单链表进行删除操作的时间复杂度为On)。删除函数的语法如下:
        
        4)查找函数get(Slink *head, int i)
        查找函数的设计思想是:线性链表中查找元素要找元素前驱的指针。在长度为n的线性单链表进行查找操作的时间复杂度为On)。查找函数的语法如下:
        
        5)求单链表长函数Length(Slink *head)
        求单链表长函数的设计思想是:通过遍历的方法,从头数到尾,即可得到单链表长。求单链表长函数的语法如下:
        
   题号导航      2019年下半年 程序员 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第37题    在手机中做本题