数据结构-单链表

1.在具有N个结点的单链表中,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。F

单链表访问前驱结点的时间复杂度为O(N),访问后继结点的时间复杂度为O(1)。

.增加结点也分为前插和后插两种情况:前插的时间复杂度为O(N),后插的时间复杂度为O(1)。

原因如下 :访问(增加)前驱结点需要从头开始顺序访问,而访问(增加)后继结点只需要进行一次间接寻址的操作。
2.(neuDS)在线性表的顺序存储结构中可实现快速的随机存取,而在链式存储结构中则只能进行顺序存取。T

3.链表是一种随机存取的存储结构。 F 顺序表才是,链表是顺序存取的存储结构

4.若用链表来表示一个线性表,则表中元素的地址一定是连续的。F 链表一定是连续

5.

线性表L在(    )情况下适用于使用链式结构实现。

  • 需经常修改L中的节点值
  • 需不断对L进行删除插入
  • L含有大量节点
  • L中节点结构复杂
  • 需经常修改L中的节点值
    
    要修改某个值前,就要先查找到这个值,但是查找效率不如【顺序表】
  • 需不断对L进行删除插入
    嗯,就是干这个事情的。这是最突出的优点。
  • L含有大量节点
    这个看情况,有大量节点需要做查找时用顺序表好,需要频繁修改用链式表好。
  • L中节点结构复杂
    节点结构复杂不复杂跟顺序表和链式表关系不大。
  • 2.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用什么存储方式最节省运算时间()
    A.单链表
    B.仅有尾指针的单循环链表
    C.仅有头指针的单循环链表
    D.带头结点的双循环链表
    答案:B
    解析:注意,该题指明插入和删除是在最后一个元素之后操作的,所以尾结点可以直接往后操作,更省时间。

    3.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。则采用哪种存储方式最节省运算时间?()
    A.单链表
    B.双链表
    C.单循环链表
    D.带头结点的双循环链表
    答案:D
    解析:结合第三题,在没有尾结点的情况下,双循环链表可以直接操作表尾,所以更节省时间。

    4.将线性表La和Lb头尾连接,要求时间复杂度为O(1),且占用辅助空间尽量小。应该使用哪种结构?()
    A.单链表
    B.单循环链表
    C.带尾指针的单循环链表
    D.带头结点的双循环链表
    答案“C
    解析:(单链表各种操作的时间复杂度在题型(一)中通过例题已详细说明)选项C和D的时间复杂度都为 O(1),但C的指针少,占用的辅助空间更小。
    5.

    1采用多项式的非零项链式存储表示法,如果两个多项式的非零项分别为N​1​​和N​2​​个,最高项指数分别为M​1​​和M​2​​,则实现两个多项式相乘的时间复杂度是:(2分)

    O(N​1​​×N​2​​)
    O(M​1​​×M​2​​)
    O(N​1​​+N​2​​)
    O(M​1​​+M​2​​)
    解析:要实现两个多项式的乘法,需要让一个多项式的每一项乘以另外一个多项式的每一项,因此这个题目的时间复杂度只跟非零项的个数有关,也就是跟N有关,与最高项的指数无关,也就是跟M无关。

  • 将长度为n的单链表连接在长度为m的单链表之后的算法的时间复杂度为( )。

    A.

    O(1)

    B.

    O(m)

    C.

    O(n)

    D.

    O(n+m)

    由于将长度为n的单链表链接在长度为m的单链表之后的操作,需要把长度为m的单链表遍历一遍,找到最后一个节点,所以时间复杂度为O(m)。

6.单链表创建的时间复杂度是O (n),而要建立一个有序的单链表,则每生成一个新结点时需要和已有的结点进行比较,确定合适的插入位置,所以时间复杂度是 O (n2)。

参考答案:D.

应该是先排序,在构建链表,排序是O(nlogn),构建链表是O(n)  
总的时间复杂度为O(nlogn)+O(n)=O(nlog2n)

可以用带表头附加结点的链表表示线性表,也可以用不带头结点的链表表示线性表,前者最主要的好处是()。B.使空表和非空表的处理统一

以下关于链式存储结构的叙述中,(C)是不正确的。

A.

结点除自身信息外还包括指针域,因此存储密度小于顺序存储结构

B.

逻辑上相邻的结点物理上不必邻接

C.

可以通过计算直接确定第i个结点的存储地址

D.

插入、删除运算操作方便,不必移动结点

在顺序表中插入一个结点的时间复杂度都是O(n2),排序的时间复杂度为O(n2)或O(nlog2n)。顺序表是一种随机存取结构,访问第i个结点和求第i个结点的直接前驱都可以直接通过数组的下标直接定位,时间复杂度是O(1)。

储密度是指一个结点数据本身所占的存储空间和整个结点所占的存储空间之比,假设单链表一个结点本身所占的空间为D,指针域所占的空间为N,则存储密度为:D/(D+N),一定小于1。

求表长、定位这两种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低

!以下说法错误的是 (c )。

A.

对于线性表来说,定位运算LocateElem在顺序表和单链表上的时间复杂度均为O(n)

B.

插入、删除操作在顺序表上的实现,平均时间复杂度为O(n)

C.

在链表上实现读表元运算的平均时间复杂度为O(1)

D.

插入、删除操作在链表上的实现可在O(1)时间内完成

已创建如下的单向链表结构,指针变量s指向链表的第一个结点。以下程序段实现的功能是( b)。

p=s->next;
s->next=s->next->next;
free(p);

A.

首结点成为尾结点

B.

删除首节点的后继节点

C.

删除首结点

D.

删除尾结点

双链表 - 插入结点

在双链表中,将 s 所指新结点插入到 p 所指结点之后,其语句应该为 ▁▁▁▁▁ 。

s->next = p->next; p->next->prev = s; p->next = s; s->prev = p;

在单链表中,将 s 所指新结点插入到 p 所指结点之后,其语句应该为 

s->next = p->next; p->next = s;

不带头结点的单链表(头指针为head)为空的判定条件是( )head=null

一个中,若删除p后续,则执行 p = p->next; p->next = p->next->next;

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用C语言实现的单链表原地逆转的代码: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; void reverseList(struct Node** head) { struct Node* prev = NULL; struct Node* current = *head; struct Node* next = NULL; while (current != NULL) { next = current->next; current->next = prev; prev = current; current = next; } *head = prev; } void printList(struct Node* head) { while (head != NULL) { printf("%d ", head->data); head = head->next; } printf("\n"); } void push(struct Node** headRef, int newData) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = newData; newNode->next = *headRef; *headRef = newNode; } int main() { struct Node* head = NULL; push(&head, 3); push(&head, 2); push(&head, 1); printf("Original list: "); printList(head); reverseList(&head); printf("Reversed list: "); printList(head); return 0; } ``` 在上述代码,我们首先定义了一个 `Node` 结构体来表示单链表的每个节点,包括节点的值和指向下一个节点的指针。然后我们定义了 `reverseList` 函数来实现原地逆转单链表的功能。该函数接受一个指向指针的指针 `head`,这是因为我们需要通过指针来修改单链表的头节点,所以我们传递指向指针的指针。在函数内部,我们使用三个指针 `prev`、`current` 和 `next` 来依次遍历单链表,并将每个节点的指针指向前一个节点,从而实现原地逆转单链表的目的。 最后,我们定义了一个 `push` 函数来添加新节点到单链表的头部,并定义了 `printList` 函数来打印单链表所有节点的值。在 `main` 函数,我们创建了一个包含三个节点的单链表,并调用 `reverseList` 函数来原地逆转该单链表,最后打印出原始和逆转后的单链表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值