林老师 · 客观题题库 · 专题 16 链表 · 复习强化

专题 16 链表 · 复习强化

115 题 · 每题对应一个知识细节 · 全部原创
真题
复刻
试卷编号ORIG-专题16链表-复习强化
题目总数120 题 · 115 分
试卷类型客观题
考生须知:
① 本卷共 20 大部分,合计 120 题 · 115 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 115 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

链表基本概念

8 QUESTIONS · 2 POINTS EACH
第 1 题 A1 未作答

单链表每个节点包含的两个部分是( )。

(1 分)
第 2 题 A2 未作答

关于单链表的头指针 head 与第一个节点的关系,正确的是( )。

(1 分)
第 3 题 A3 未作答

链表各节点在内存中的存放方式是( )。

(1 分)
第 4 题 A4 未作答

与固定长度的数组相比,链表在数据规模方面的特点是( )。

(1 分)
第 5 题 A5 未作答

单链表最后一个节点的指针域通常存放( )。

(1 分)
第 6 题 A6 未作答

判断一个单链表当前没有任何节点,依据是( )。

(1 分)
第 7 题 A7 未作答

按指针连接方式分类,链表的三种基本形态是( )。

(1 分)
第 8 题 A8 未作答

链表与数组最本质的区别是( )。

(1 分)

单链表操作概念

8 QUESTIONS · 2 POINTS EACH
第 9 题 B1 未作答

单链表从头到尾访问每个节点,能采用的移动方式是( )。

(1 分)
第 10 题 B2 未作答

在单链表中查找值等于 x 的节点,最少必须做的事是( )。

(1 分)
第 11 题 B3 未作答

头插法插入新节点 t 的两步核心操作是( )。

(1 分)
第 12 题 B4 未作答

用尾插法把新节点接在链表末尾,需要的条件或做法是( )。

(1 分)
第 13 题 B5 未作答

在第 ii 个节点之后插入新节点 t,正确的指针操作顺序是( )。

(1 分)
第 14 题 B6 未作答

从单链表中删除 p 的后继节点 q,正确的操作是( )。

(1 分)
第 15 题 B7 未作答

访问单链表的第 kk 个节点,时间代价是( )。

(1 分)
第 16 题 B8 未作答

依次读入 1,2,3,41,2,3,4:用头插法建链后从前往后输出,与用尾插法建链后从前往后输出,分别得到( )。

(1 分)

复杂度与对比

6 QUESTIONS · 2 POINTS EACH
第 17 题 C1 未作答

已经定位到插入或删除位置的前提下,单链表插入、删除节点本身的时间复杂度是( )。

(1 分)
第 18 题 C2 未作答

在数组中部插入或删除一个元素,平均需要搬移的元素个数约为( )。

(1 分)
第 19 题 C3 未作答

单链表中查找某个值,时间复杂度是( )。

(1 分)
第 20 题 C4 未作答

不带尾指针的单链表,「头部插入」与「尾部插入」的时间代价是( )。

(1 分)
第 21 题 C5 未作答

在序列中部频繁插入删除元素,链表与数组相比( )。

(1 分)
第 22 题 C6 未作答

关于链表与数组的内存布局,正确的是( )。

(1 分)

双向链表

7 QUESTIONS · 2 POINTS EACH
第 23 题 D1 未作答

双向链表每个节点包含的三个部分是( )。

(1 分)
第 24 题 D2 未作答

在双向链表中,节点 p 的前驱与后继分别通过( )访问。

(1 分)
第 25 题 D3 未作答

在双向链表节点 p 与其后继 q 之间插入新节点 t,至少要改动的指针数是( )。

(1 分)
第 26 题 D4 未作答

从双向链表中删除节点 p(非首非尾),正确的操作是( )。

(1 分)
第 27 题 D5 未作答

要从尾部向头部逐个访问节点,双向链表与单链表相比( )。

(1 分)
第 28 题 D6 未作答

双向链表用每个节点多一个指针的代价换来的主要好处是( )。

(1 分)
第 29 题 D7 未作答

链表代码里设置哑节点(不存真实数据的附加节点)的主要目的(在后文中「哑节点」统一指此概念)是( )。

(1 分)

循环链表

6 QUESTIONS · 2 POINTS EACH
第 30 题 E1 未作答

单循环链表区别于普通单链表的特征是( )。

(1 分)
第 31 题 E2 未作答

遍历单循环链表一圈,终止条件通常写成( )。

(1 分)
第 32 题 E3 未作答

约瑟夫问题:nn 个人围成一圈,从某人起报数,每报到 mm 的人出列并由下一人继续。最适合自然模拟这一过程的数据结构是( )。

(1 分)
第 33 题 E4 未作答

带尾指针 tail 的单循环链表,只凭 tail 就能在 O(1)O(1) 内完成的操作是( )。

(1 分)
第 34 题 E5 未作答

单循环链表的一个独特能力是( )。

(1 分)
第 35 题 E6 未作答

遍历单循环链表时,若把终止条件误写成与单链表相同的 p != NULL,后果是( )。

(1 分)

链表应用

5 QUESTIONS · 2 POINTS EACH
第 36 题 F1 未作答

用单链表实现栈,入栈与出栈都应对链表的哪一端操作( )。

(1 分)
第 37 题 F2 未作答

用单链表实现队列,正确的指针配置是( )。

(1 分)
第 38 题 F3 未作答

哈希表处理冲突的链地址法,把冲突元素组织成链表挂在对应桶上,这里链表承担的角色(此处仅作链表应用了解)是( )。

(1 分)
第 39 题 F4 未作答

数据总量事先无法估计、且会频繁增删,链表与定长数组相比更合适的原因是( )。

(1 分)
第 40 题 F5 未作答

维护一条有序单链表,插入新值时从头找第一个比它大的节点,插到其前面。这样维护的好处是( )。

(1 分)

快慢与双指针

5 QUESTIONS · 2 POINTS EACH
第 41 题 G1 未作答

快慢指针判断链表是否有环的原理是( )。

(1 分)
第 42 题 G2 未作答

快慢指针找链表中间节点,指针的走法是( )。

(1 分)
第 43 题 G3 未作答

一次遍历求倒数第 kk 个节点的双指针技巧是( )。

(1 分)
第 44 题 G4 未作答

「当前指针 p 与后继指针 q 同速前进」的双指针遍历,相比单指针的好处(在删除场景中最明显)是( )。

(1 分)
第 45 题 G5 未作答

快指针一次走两步的循环条件要写成 while (fast && fast->next),两个条件的作用是( )。

(1 分)

数组模拟链表

5 QUESTIONS · 2 POINTS EACH
第 46 题 H1 未作答

数组模拟链表(静态链表)用两个平行数组 data[]nxt[] 存链,其中 nxt[i] 存放( )。

(1 分)
第 47 题 H2 未作答

静态链表的「头指针」实际是( )。

(1 分)
第 48 题 H3 未作答

静态链表在第 ii 号节点后插入新节点(放在空闲下标 jj 处),需要做的赋值是( )。

(1 分)
第 49 题 H4 未作答

静态链表中删除第 ii 号节点的后继 jj,正确的操作是( )。

(1 分)
第 50 题 H5 未作答

静态链表与动态链表相比的固有限制是( )。

(1 分)

单链表代码基础

8 QUESTIONS · 2 POINTS EACH
第 51 题 I1 未作答

01struct Node { int data; Node* next; };
02int main() {
03    Node* head = NULL;
04    for (int i = 1; i <= 4; i++) {
05        Node* t = new Node;
06        t->data = i;
07        t->next = head;
08        head = t;
09    }
10    for (Node* p = head; p != NULL; p = p->next)
11        cout << p->data << " ";
12    return 0;
13}

输出是( )。

(1 分)
第 52 题 I2 未作答

01struct Node { int data; Node* next; };
02int main() {
03    Node* head = NULL;
04    Node* tail = NULL;
05    for (int i = 1; i <= 3; i++) {
06        Node* t = new Node;
07        t->data = i;
08        t->next = NULL;
09        if (head == NULL) head = t;
10        else tail->next = t;
11        tail = t;
12    }
13    for (Node* p = head; p != NULL; p = p->next)
14        cout << p->data << " ";
15    return 0;
16}

输出是( )。

(1 分)
第 53 题 I3 未作答

01// 链表已建为 4 -> 6 -> 2 -> NULL(head 指向 4)
02int s = 0;
03for (Node* p = head; p != NULL; p = p->next)
04    s += p->data;
05cout << s;

输出是( )。

(1 分)
第 54 题 I4 未作答

01// 链表为 1 -> 2 -> 3 -> 4 -> 5 -> NULL
02int n = 0;
03for (Node* p = head; p != NULL; p = p->next)
04    n++;
05cout << n;

输出是( )。

(1 分)
第 55 题 I5 未作答

01// 链表为 3 -> 9 -> 5 -> 7 -> NULL
02int mx = head->data;
03for (Node* p = head->next; p != NULL; p = p->next)
04    if (p->data > mx) mx = p->data;
05cout << mx;

输出是( )。

(1 分)
第 56 题 I6 未作答

01// 链表为 2 -> 5 -> 3 -> 8 -> 6 -> NULL
02int x = 5, cnt = 0;
03for (Node* p = head; p != NULL; p = p->next)
04    if (p->data > x) cnt++;
05cout << cnt;

输出是( )。

(1 分)
第 57 题 I7 未作答

01// 链表为 1 -> 2 -> 3 -> NULL
02while (head != NULL) {
03    cout << head->data << " ";
04    Node* t = head;
05    head = head->next;
06    delete t;
07}

输出是( )。

(1 分)
第 58 题 I8 未作答

01Node* head = NULL;
02if (head == NULL) cout << "empty";
03else cout << head->data;

输出是( )。

(1 分)

单链表代码操作

8 QUESTIONS · 2 POINTS EACH
第 59 题 J1 未作答

// 链表为 1 -> 3 -> 5 -> NULL,p 指向值为 3 的节点
Node* t = new Node;
t->data = 4;
t->next = p->next;
p->next = t;
// 从 head 输出整条链

输出是( )。

(1 分)
第 60 题 J2 未作答

01// 链表为 1 -> 2 -> 3 -> 2 -> NULL
02Node* p = head;
03while (p->next != NULL && p->next->data != 2)
04    p = p->next;
05if (p->next != NULL) {
06    Node* t = p->next;
07    p->next = t->next;
08    delete t;
09}
10// 从 head 输出整条链

输出是( )。

(1 分)
第 61 题 J3 未作答

空链表上依次执行:头插 1010、头插 2020,然后从 head 输出,结果是( )。

(1 分)
第 62 题 J4 未作答

01// 链表为 1 -> 2 -> 3 -> 4 -> NULL
02Node* rev = NULL;
03while (head != NULL) {
04    Node* t = head->next;
05    head->next = rev;
06    rev = head;
07    head = t;
08}
09// 从 rev 输出整条链

输出是( )。

(1 分)
第 63 题 J5 未作答

// 链表为 5 -> 3 -> 8 -> 1 -> 6 -> NULL,删除第 2 个节点
Node* p = head;          // p 指向第 1 个节点(5)
Node* t = p->next;
p->next = t->next;
delete t;
// 从 head 输出整条链

输出是( )。

(1 分)
第 64 题 J6 未作答

01// 链表为 5 -> 3 -> 8 -> 1 -> 6 -> NULL
02int k = 3;
03Node* p = head;
04for (int i = 1; i < k; i++)
05    p = p->next;
06cout << p->data;

输出是( )。

(1 分)
第 65 题 J7 未作答

01// 链表为 1 -> 3 -> 5 -> 7 -> NULL
02bool inc = true;
03for (Node* p = head; p->next != NULL; p = p->next)
04    if (p->data >= p->next->data) inc = false;
05cout << (inc ? 1 : 0);

输出是( )。

(1 分)
第 66 题 J8 未作答

01// 有序链表为 1 -> 3 -> 7 -> NULL,插入 5
02Node* p = head;
03while (p->next != NULL && p->next->data < 5)
04    p = p->next;
05Node* t = new Node;
06t->data = 5;
07t->next = p->next;
08p->next = t;
09// 从 head 输出整条链

输出是( )。

(1 分)
拾壹

双向循环代码

6 QUESTIONS · 2 POINTS EACH
第 67 题 K1 未作答

双向链表 1 <-> 2 <-> 3tail 指向值为 33 的节点,执行:

01for (DN* p = tail; p != NULL; p = p->prev)
02    cout << p->d << " ";

输出是( )。

(1 分)
第 68 题 K2 未作答

循环链表节点值从某处起依次为 1,2,3,4,51,2,3,4,5 首尾相接,指针 p 当前指向值为 11 的节点。连续执行 77p = p->next 后,p->data 是( )。

(1 分)
第 69 题 K3 未作答

01// 链表为 1 -> 2 -> 3 -> 4 -> 2(4 的 next 指回 2,成环)
02Node* slow = head;
03Node* fast = head;
04int meet = -1;
05while (fast != NULL && fast->next != NULL) {
06    slow = slow->next;
07    fast = fast->next->next;
08    if (slow == fast) { meet = slow->data; break; }
09}
10cout << meet;

输出是( )。

(1 分)
第 70 题 K4 未作答

01struct DN { int d; DN* prev; DN* next; };
02DN a = {1, NULL, NULL}, c = {3, NULL, NULL};
03a.next = &c; c.prev = &a;
04DN b = {2, NULL, NULL};
05b.prev = &a;
06b.next = &c;
07a.next = &b;
08c.prev = &b;
09for (DN* p = &a; p != NULL; p = p->next)
10    cout << p->d << " ";

输出是( )。

(1 分)
第 71 题 K5 未作答

01struct Node { int data; Node* next; };
02Node* head = NULL;
03Node* tail = NULL;
04for (int i = 1; i <= 3; i++) {
05    Node* t = new Node;
06    t->data = i;
07    if (head == NULL) { head = t; t->next = head; }
08    else { t->next = head; tail->next = t; }
09    tail = t;
10}
11Node* p = head;
12do {
13    cout << p->data << " ";
14    p = p->next;
15} while (p != head);

输出是( )。

(1 分)
第 72 题 K6 未作答

约瑟夫问题:55 个人编号 1155 围成圈,从 11 号起报数,报到 33 的人出列,下一人继续从 11 报起。出列顺序是( )。

(1 分)
拾贰

静态链表代码

6 QUESTIONS · 2 POINTS EACH
第 73 题 L1 未作答

静态链表数组如下,head = 0

01int data[] = {7, 9, 3, 1, 5};
02int nxt[]  = {2, 4, 1, -1, 3};

head 沿 nxt 依次输出 data,结果是( )。

(1 分)
第 74 题 L2 未作答

静态链表 data = {7, 9, 3, 1, 5}nxt = {2, 4, 1, -1, 3}head = 0。从 head 沿链把各节点的 data 累加,总和是( )。

(1 分)
第 75 题 L3 未作答

静态链表 data = {7, 9, 3, 1, 5}nxt = {2, 4, 1, -1, 3}head = 0。在值为 99 的节点(下标 11)之后插入空闲下标 55、值为 66 的新节点:先 nxt[5] = nxt[1],再 nxt[1] = 5。插入后从 head 输出的值序列是( )。

(1 分)
第 76 题 L4 未作答

静态链表 data = {7, 9, 3, 1, 5}nxt = {2, 4, 1, -1, 3}head = 0。删除值为 99 的节点(下标 11)的后继,即执行 nxt[1] = nxt[4]。删除后从 head 输出的值序列是( )。

(1 分)
第 77 题 L5 未作答

01int data[] = {7, 9, 3, 1, 5};
02int nxt[] = {2, 4, 1, -1, 3};
03int head = 0;
04int pos = -1;
05for (int p = head; p != -1; p = nxt[p])
06    if (data[p] == 5) pos = p;
07cout << pos;

输出是( )。

(1 分)
第 78 题 L6 未作答

用静态链表从头建链存放读入序列 10,20,3010, 20, 30(尾插,cnt00 起分配下标,nxt[t] = -1 接尾)。建完后 nxt[1]nxt[2] 的值分别是( )。

(1 分)
拾叁

快慢指针代码

5 QUESTIONS · 2 POINTS EACH
第 79 题 M1 未作答

01// 链表为 1 -> 2 -> 3 -> 4 -> 2(4 的 next 指回 2)
02Node* slow = head;
03Node* fast = head;
04int steps = 0;
05while (slow != fast || steps == 0) {
06    slow = slow->next;
07    fast = fast->next->next;
08    steps++;
09    if (slow == fast) break;
10}
11cout << slow->data;

输出是( )。

(1 分)
第 80 题 M2 未作答

01// 链表为 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> NULL
02Node* slow = head;
03Node* fast = head;
04while (fast != NULL && fast->next != NULL) {
05    slow = slow->next;
06    fast = fast->next->next;
07}
08cout << slow->data;

输出是( )。

(1 分)
第 81 题 M3 未作答

01// 链表为 1 -> 2 -> 3 -> 4 -> 5 -> NULL,删除倒数第 2 个节点
02int k = 2;
03Node* f = head;
04Node* s = head;
05for (int i = 0; i < k; i++) f = f->next;
06while (f->next != NULL) {
07    f = f->next;
08    s = s->next;
09}
10Node* t = s->next;
11s->next = t->next;
12delete t;
13// 从 head 输出整条链

输出是( )。

(1 分)
第 82 题 M4 未作答

01// 链表为 1 -> 2 -> 3 -> 4 -> 5 -> NULL
02for (Node* p = head, *q = head->next; q != NULL; p = p->next, q = q->next)
03    cout << q->data << " ";

输出是( )。

(1 分)
第 83 题 M5 未作答

快指针循环条件 while (fast != NULL && fast->next != NULL) 中,若删去第二个条件只留 fast != NULL,快指针走到两步时可能发生( )。

(1 分)
拾肆

完善程序

6 QUESTIONS · 2 POINTS EACH
第 84 题 N1 未作答

补全头插法插入新节点的关键语句:

01struct Node { int data; Node* next; };
02Node* head = NULL;
03Node* t = new Node;
04t->data = 5;
05t->next = /* 1 */;
06head = t;

空位 /* 1 */ 处应填( )。

(1 分)
第 85 题 N2 未作答

带尾指针建链,补全尾插的关键语句:

01Node* tail = NULL;
02Node* t = new Node;
03t->data = 5;
04t->next = NULL;
05if (head == NULL) head = t;
06else /* 1 */ ;
07tail = t;

空位 /* 1 */ 处应填( )。

(1 分)
第 86 题 N3 未作答

补全链表遍历的循环推进语句:

01int cnt = 0;
02for (Node* p = head; p != NULL; /* 1 */)
03    cnt++;

空位 /* 1 */ 处应填( )。

(1 分)
第 87 题 N4 未作答

删除单链表中 p 的后继节点,补全跨接语句:

Node* t = p->next;
/* 1 */ ;
delete t;

空位 /* 1 */ 处应填( )。

(1 分)
第 88 题 N5 未作答

读入 nn 个数头插建链,补全循环条件:

01Node* head = NULL;
02int n, x;
03cin >> n;
04for (/* 1 */) {
05    cin >> x;
06    Node* t = new Node;
07    t->data = x;
08    t->next = head;
09    head = t;
10}

空位 /* 1 */ 处应填( )。

(1 分)
第 89 题 N6 未作答

补全整链释放循环的关键语句:

01while (head != NULL) {
02    /* 1 */ ;
03    head = head->next;
04    delete t;
05}

空位 /* 1 */ 处应填( )。

(1 分)
拾伍

综合代码

5 QUESTIONS · 2 POINTS EACH
第 90 题 O1 未作答

链表队列(头指针管出队、尾指针管入队)依次执行:入队 11、入队 22、出队、入队 33。从队首到队尾输出,结果是( )。

(1 分)
第 91 题 O2 未作答

链表栈(头部即栈顶)依次执行:入栈 11、入栈 22、出栈。此时栈顶的值是( )。

(1 分)
第 92 题 O3 未作答

有序链表 1 -> 4 -> 7,先用有序插入法插入 33,再插入 55,从 head 输出的结果是( )。

(1 分)
第 93 题 O4 未作答

约瑟夫问题:55 个人编号 1155 围成圈,从 11 号起报数,报到 33 出列,直到只剩一人。最后留下的是( )。

(1 分)
第 94 题 O5 未作答

图的邻接表存储中,每个顶点挂一条「边链表」,这里对链表的使用方式属于( )。

(1 分)
拾陆

易错排查

6 QUESTIONS · 2 POINTS EACH
第 95 题 P1 未作答

在节点 p 之后插入新节点 t 时,若先执行 p->next = t; 再执行 t->next = p->next;,结果是( )。

(1 分)
第 96 题 P2 未作答

头插法只写了 t->next = head; 却忘了 head = t;,后果是( )。

(1 分)
第 97 题 P3 未作答

输出链表每个节点时把循环条件写成 for (Node* p = head; p->next != NULL; p = p->next),直接后果是( )。

(1 分)
第 98 题 P4 未作答

delete p; 之后又执行 cout << p->data;,这属于( )。

(1 分)
第 99 题 P5 未作答

链表为空(head == NULL)时直接执行 head->data,结果是( )。

(1 分)
第 100 题 P6 未作答

双向链表插入节点时只改了 p->next = t; t->prev = p;,漏改了 t->next->prev,后果是( )。

(1 分)
拾柒

GESP 高频题型强化

12 QUESTIONS · 2 POINTS EACH
第 101 题 Q1 未作答

补全「删除双向链表中间节点 p」的代码(p 的前驱后继均非空):

01struct Node { int val; Node* prev; Node* next; };
02void delMid(Node* p) {
03    /* 1 */
04    delete p;
05}

空位 /* 1 */ 处应填( )。

(1 分)
第 102 题 Q2 未作答

双向链表中在结点 p 之后插入结点 sp 有后继),下列四句的正确组合与书写顺序是( )。

(1 分)
第 103 题 Q3 未作答

删除双向链表结点 p(前驱后继均非空),下列写法中错误的是( )。

(1 分)
第 104 题 Q4 未作答

用哑结点统一删除链表中所有值为 x 的节点,补全删除语句:

01Node* eraseAll(Node* head, int x) {
02    Node dummy(0);
03    dummy.next = head;
04    Node* cur = &dummy;
05    while (cur->next) {
06        if (cur->next->data == x) {
07            Node* del = cur->next;
08            /* 1 */
09            delete del;
10        } else {
11            cur = cur->next;
12        }
13    }
14    return dummy.next;
15}

空位 /* 1 */ 处应填( )。

(1 分)
第 105 题 Q5 未作答

补全 Floyd 快慢指针判环的移动语句(slow 一步、fast 两步):

01bool hasCycle(Node* head) {
02    Node* slow = head;
03    Node* fast = head;
04    while (fast != NULL && fast->next != NULL) {
05        /* 1 */
06        if (slow == fast) return true;
07    }
08    return false;
09}

空位 /* 1 */ 处应填( )。

(1 分)
第 106 题 Q6 未作答

下面的单链表反转代码有一处错误,应修改的是( )。

01Node* reverse(Node* head) {
02    Node* prev = NULL;
03    Node* current = head;
04    while (current != NULL) {
05        Node* nxt = current->next;
06        current->next = nxt;
07        prev = current;
08        current = nxt;
09    }
10    return prev;
11}

(1 分)
第 107 题 Q7 未作答

补全双向链表 append(尾插)的非空分支:

01void append(int data) {
02    Node* newNode = new Node(data);
03    if (head == NULL) {
04        head = tail = newNode;
05    } else {
06        /* 1 */
07    }
08    ++size;
09}

空位 /* 1 */ 处应填( )。

(1 分)
第 108 题 Q8 未作答

单向循环链表(head != NULL)在头节点之后插入新节点,补全:

01void insertAfterHead(Node* head, int x) {
02    Node* newNode = new Node;
03    newNode->val = x;
04    /* 1 */
05}

空位 /* 1 */ 处应填( )。

(1 分)
第 109 题 Q9 未作答

双向链表中在结点 p 之前插入结点 s(均非空),正确的四句是( )。

(1 分)
第 110 题 Q10 未作答

双向链表用 headtail 两个指针维护,判断链表为空,下列写法中不能正确工作的是( )。

(1 分)
第 111 题 Q11 未作答

已知指向待删结点本身的指针,单链表与双向链表删除该结点的时间复杂度分别是( )。

(1 分)
第 112 题 Q12 未作答

单向循环链表从 head 出发输出一圈,补全循环:

Node* p = head;
/* 1 {
    cout << p->data << " ";
    p = p->next;
} /* 2 */

空位 /* 1/* 2 处应分别填( )。

(1 分)
拾捌

GESP 判断题考法强化

3 QUESTIONS · 2 POINTS EACH
第 113 题 R1 未作答

要删除单链表中结点 p(非尾结点)但拿不到头指针,可行的做法是( )。

(1 分)
第 114 题 R2 未作答

「二分查找只适用于数组,不适合链表」的根本原因是( )。

(1 分)
第 115 题 R3 未作答

操作系统把 CPU 时间片轮流分给一组进程,一个进程时间片用完就切到下一个,轮完一圈回到开头。最适合建模这一轮转场景的结构是( )。

(1 分)

真 题 演 练

1 QUESTIONS · 真题演练不计分
第 1 题 单选 未作答

假设有一个链表的节点定义如下:

01struct Node {
02    int data;
03    Node* next;
04};

现在有一个指向链表头部的指针:Node* head。如果想要在链表中插入一个新节点,其成员 data 的值为 42,并使新节点成为链表的第一个节点,下面哪个操作是正确的?( )

(0 分)
CSP-J 2023 · 单选 第4题 | 知识点 单向链表、程序阅读与输出推断、指针

GESP 真 题 演 练

4 QUESTIONS · 真题演练不计分
第 1 题 单选 未作答

下面的代码片段用于在双向链表中删除一个节点。请在横线处填入( ),使其能正确实现相应功能。

01void deleteNode(DoublyListNode*& head, int value) {
02    DoublyListNode* current = head;
03    while (current != nullptr && current->val != value) {
04        current = current->next;
05    }
06    if (current != nullptr) {
07        if (current->prev != nullptr) {
08            ____________ // 在此处填入代码
09        } else {
10            head = current->next;
11        }
12        if (current->next != nullptr) {
13            current->next->prev = current->prev;
14        }
15        delete current;
16    }
17}

(0 分)
GESP 五级 2024-03 · 单选 第4题 | 知识点 双向链表、程序补全
第 2 题 单选 未作答

函数 hasCycle 采用 Floyd 快慢指针法判断一个单链表中是否存在环,链表的头节点为 head,即用两个指针在链表上前进:slow 每次走 11 步,fast 每次走 22 步,若存在环,fast 终会追上 slow(相遇);若无环,fast 会先到达 nullptr,则横线上应填写( )。

01struct Node {
02    int val;
03    Node *next;
04    Node(int x) : val(x), next(nullptr) {}
05};
06
07bool hasCycle(Node *head) {
08    if (!head || !head->next)
09        return false;
10    Node* slow = head;
11    Node* fast = head->next;
12    while (fast && fast->next) {
13        if (slow == fast) return true;
14        ____________        // 在此填入代码
15    }
16    return false;
17}

(0 分)
GESP 五级 2025-09 · 单选 第3题 | 知识点 单向链表、双指针、程序补全
第 3 题 单选 未作答

下面的代码片段用于反转单链表,请进行( )修改,使其能正确实现相应功能。

01ListNode* reverseLinkedList(ListNode* head) {
02    ListNode* prev = nullptr;
03    ListNode* current = head;
04    while (current != nullptr) {
05        ListNode* next = current->next;
06        current->next = next;
07        prev = current;
08        current = next;
09    }
10    return prev;
11}

(0 分)
GESP 六级 2024-03 · 单选 第15题 | 知识点 单向链表、程序补全
第 4 题 单选 未作答

为了方便链表的增删操作,一些算法生成一个虚拟头节点,方便统一删除头节点和其他节点。下面代码实现了删除链表中值为 val 的节点,横线上应填的最佳代码是( )。

01struct LinkedNode {
02    int val;
03    LinkedNode* next;
04    LinkedNode(int val):val(val), next(nullptr){}
05};
06
07void removeElements(LinkedNode* head, int val) {
08    if (head == nullptr) {
09        return;
10    }
11    LinkedNode* cur;
12    LinkedNode* dummyHead = new LinkedNode(0); //虚拟头节点
13    ____________      // 在此处填入代码
14
15    while(cur ->next ! = nullptr) {
16        if(cur->next->val == val) {
17            LinkedNode* tmp = cur->next;
18            cur->next = cur->next->next;
19            delete tmp;
20            tmp = nullptr;
21        }
22        else {
23            cur = cur ->next;
24        }
25    }
26    head = dummyHead->next;
27    delete dummyHead;
28    dummyHead = nullptr;
29}

(0 分)
GESP 五级 2024-12 · 单选 第3题 | 知识点 单向链表、程序补全