题目描述
请编写程序,将 nnn 个整数顺次插入一个初始为空的单链表的表头。对任一给定的位序 iii(从 1 开始),输出链表中第 iii 个元素的值。
输入格式:
输入首先在第一行给出非负整数 nnn(≤20\le 20≤20);随后一行给出 nnn 个 int 范围内的正整数,数字间以空格分隔。最后一行给出位序 iii,为 int 范围内的非负整数。
输出格式:
在一行中输出链表中第 iii 个元素的值。如果这个元素不存在,则输出 -1。
输入样例:
5
1 2 3 4 5
4
输出样例:
2
输入样例:
5
1 2 3 4 5
0
输出样例:
-1
解题思路
本题考察单链表的建立与按位序取值操作。题目要求将 nnn 个整数"顺次插入表头",即每次都把新读入的整数插到链表头部(头插法)。头插法建立完成后,链表中结点的顺序恰好是输入序列的逆序:最先插入的元素在链尾,最后插入的元素在表头。
位序 iii 从 1 开始计数,因此第 iii 个元素就是从头结点开始沿 next 指针前进 i−1i-1i−1 步后所在的结点。由于单链表不支持随机访问,只能通过指针逐结点移动来定位。
时间复杂度:建立链表为 O(n)O(n)O(n),按位序查找最多移动 iii 次,为 O(n)O(n)O(n),总体 O(n)O(n)O(n)。
空间复杂度:链表结点数为 nnn,为 O(n)O(n)O(n)。
代码流程说明
- 定义
Node结构体,包含数据域data、指针域next,并提供构造函数Node(int d)将next初始化为nullptr。 main函数中先读入整数个数n,将链表头指针head初始化为空。- 循环
n次:每次读入一个整数v,new出一个新结点p,采用头插法将其插入链表(p->next = head; head = p;)。 - 读入位序
i。 - 若
i < 1,位序不合法,直接输出-1并结束程序。 - 用指针
p指向表头,循环k从 1 到i-1且p非空,让p = p->next,将指针移动到第 iii 个结点。 - 若移动后
p为空(说明第 iii 个结点不存在,超出表长),输出-1;否则输出p->data。
代码实现
cpp
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
Node(int d) : data(d), next(nullptr) {}
};
int main() {
int n, i;
cin >> n;
Node* head = nullptr;
for (int k = 0; k < n; ++k) {
int v;
cin >> v;
Node* p = new Node(v);
p->next = head;
head = p;
}
cin >> i;
// 依次头插后链表为输入序列的逆序,第 i 个元素即从表头数第 i 个
if (i < 1) { cout << -1 << endl; return 0; }
Node* p = head;
for (int k = 1; k < i && p; ++k) p = p->next;
if (!p) cout << -1 << endl;
else cout << p->data << endl;
return 0;
}
代码流程图
#mermaid-svg-Zbv9MsyeWSUfqhbM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Zbv9MsyeWSUfqhbM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Zbv9MsyeWSUfqhbM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Zbv9MsyeWSUfqhbM .error-icon{fill:#552222;}#mermaid-svg-Zbv9MsyeWSUfqhbM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Zbv9MsyeWSUfqhbM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Zbv9MsyeWSUfqhbM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Zbv9MsyeWSUfqhbM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Zbv9MsyeWSUfqhbM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Zbv9MsyeWSUfqhbM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Zbv9MsyeWSUfqhbM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Zbv9MsyeWSUfqhbM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Zbv9MsyeWSUfqhbM .marker.cross{stroke:#333333;}#mermaid-svg-Zbv9MsyeWSUfqhbM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Zbv9MsyeWSUfqhbM p{margin:0;}#mermaid-svg-Zbv9MsyeWSUfqhbM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Zbv9MsyeWSUfqhbM .cluster-label text{fill:#333;}#mermaid-svg-Zbv9MsyeWSUfqhbM .cluster-label span{color:#333;}#mermaid-svg-Zbv9MsyeWSUfqhbM .cluster-label span p{background-color:transparent;}#mermaid-svg-Zbv9MsyeWSUfqhbM .label text,#mermaid-svg-Zbv9MsyeWSUfqhbM span{fill:#333;color:#333;}#mermaid-svg-Zbv9MsyeWSUfqhbM .node rect,#mermaid-svg-Zbv9MsyeWSUfqhbM .node circle,#mermaid-svg-Zbv9MsyeWSUfqhbM .node ellipse,#mermaid-svg-Zbv9MsyeWSUfqhbM .node polygon,#mermaid-svg-Zbv9MsyeWSUfqhbM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Zbv9MsyeWSUfqhbM .rough-node .label text,#mermaid-svg-Zbv9MsyeWSUfqhbM .node .label text,#mermaid-svg-Zbv9MsyeWSUfqhbM .image-shape .label,#mermaid-svg-Zbv9MsyeWSUfqhbM .icon-shape .label{text-anchor:middle;}#mermaid-svg-Zbv9MsyeWSUfqhbM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Zbv9MsyeWSUfqhbM .rough-node .label,#mermaid-svg-Zbv9MsyeWSUfqhbM .node .label,#mermaid-svg-Zbv9MsyeWSUfqhbM .image-shape .label,#mermaid-svg-Zbv9MsyeWSUfqhbM .icon-shape .label{text-align:center;}#mermaid-svg-Zbv9MsyeWSUfqhbM .node.clickable{cursor:pointer;}#mermaid-svg-Zbv9MsyeWSUfqhbM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Zbv9MsyeWSUfqhbM .arrowheadPath{fill:#333333;}#mermaid-svg-Zbv9MsyeWSUfqhbM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Zbv9MsyeWSUfqhbM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Zbv9MsyeWSUfqhbM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Zbv9MsyeWSUfqhbM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Zbv9MsyeWSUfqhbM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Zbv9MsyeWSUfqhbM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Zbv9MsyeWSUfqhbM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Zbv9MsyeWSUfqhbM .cluster text{fill:#333;}#mermaid-svg-Zbv9MsyeWSUfqhbM .cluster span{color:#333;}#mermaid-svg-Zbv9MsyeWSUfqhbM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Zbv9MsyeWSUfqhbM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Zbv9MsyeWSUfqhbM rect.text{fill:none;stroke-width:0;}#mermaid-svg-Zbv9MsyeWSUfqhbM .icon-shape,#mermaid-svg-Zbv9MsyeWSUfqhbM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Zbv9MsyeWSUfqhbM .icon-shape p,#mermaid-svg-Zbv9MsyeWSUfqhbM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Zbv9MsyeWSUfqhbM .icon-shape .label rect,#mermaid-svg-Zbv9MsyeWSUfqhbM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Zbv9MsyeWSUfqhbM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Zbv9MsyeWSUfqhbM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Zbv9MsyeWSUfqhbM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
是
否
是
否
开始
读入 n
初始化 head 为空
是否还有 k < n 个数未读入
读入 v
创建新结点 p
p->next = head
head = p
读入位序 i
i < 1
输出 -1
结束
p 指向表头
k 从 1 到 i-1 且 p 非空
p = p->next
p 是否为空
输出 -1
输出 p->data
解题流程图
#mermaid-svg-RGeEhmoISO6UYG42{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RGeEhmoISO6UYG42 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RGeEhmoISO6UYG42 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RGeEhmoISO6UYG42 .error-icon{fill:#552222;}#mermaid-svg-RGeEhmoISO6UYG42 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RGeEhmoISO6UYG42 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RGeEhmoISO6UYG42 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RGeEhmoISO6UYG42 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RGeEhmoISO6UYG42 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RGeEhmoISO6UYG42 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RGeEhmoISO6UYG42 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RGeEhmoISO6UYG42 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RGeEhmoISO6UYG42 .marker.cross{stroke:#333333;}#mermaid-svg-RGeEhmoISO6UYG42 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RGeEhmoISO6UYG42 p{margin:0;}#mermaid-svg-RGeEhmoISO6UYG42 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-RGeEhmoISO6UYG42 .cluster-label text{fill:#333;}#mermaid-svg-RGeEhmoISO6UYG42 .cluster-label span{color:#333;}#mermaid-svg-RGeEhmoISO6UYG42 .cluster-label span p{background-color:transparent;}#mermaid-svg-RGeEhmoISO6UYG42 .label text,#mermaid-svg-RGeEhmoISO6UYG42 span{fill:#333;color:#333;}#mermaid-svg-RGeEhmoISO6UYG42 .node rect,#mermaid-svg-RGeEhmoISO6UYG42 .node circle,#mermaid-svg-RGeEhmoISO6UYG42 .node ellipse,#mermaid-svg-RGeEhmoISO6UYG42 .node polygon,#mermaid-svg-RGeEhmoISO6UYG42 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RGeEhmoISO6UYG42 .rough-node .label text,#mermaid-svg-RGeEhmoISO6UYG42 .node .label text,#mermaid-svg-RGeEhmoISO6UYG42 .image-shape .label,#mermaid-svg-RGeEhmoISO6UYG42 .icon-shape .label{text-anchor:middle;}#mermaid-svg-RGeEhmoISO6UYG42 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RGeEhmoISO6UYG42 .rough-node .label,#mermaid-svg-RGeEhmoISO6UYG42 .node .label,#mermaid-svg-RGeEhmoISO6UYG42 .image-shape .label,#mermaid-svg-RGeEhmoISO6UYG42 .icon-shape .label{text-align:center;}#mermaid-svg-RGeEhmoISO6UYG42 .node.clickable{cursor:pointer;}#mermaid-svg-RGeEhmoISO6UYG42 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RGeEhmoISO6UYG42 .arrowheadPath{fill:#333333;}#mermaid-svg-RGeEhmoISO6UYG42 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RGeEhmoISO6UYG42 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RGeEhmoISO6UYG42 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RGeEhmoISO6UYG42 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RGeEhmoISO6UYG42 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RGeEhmoISO6UYG42 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RGeEhmoISO6UYG42 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RGeEhmoISO6UYG42 .cluster text{fill:#333;}#mermaid-svg-RGeEhmoISO6UYG42 .cluster span{color:#333;}#mermaid-svg-RGeEhmoISO6UYG42 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RGeEhmoISO6UYG42 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RGeEhmoISO6UYG42 rect.text{fill:none;stroke-width:0;}#mermaid-svg-RGeEhmoISO6UYG42 .icon-shape,#mermaid-svg-RGeEhmoISO6UYG42 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RGeEhmoISO6UYG42 .icon-shape p,#mermaid-svg-RGeEhmoISO6UYG42 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RGeEhmoISO6UYG42 .icon-shape .label rect,#mermaid-svg-RGeEhmoISO6UYG42 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RGeEhmoISO6UYG42 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RGeEhmoISO6UYG42 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RGeEhmoISO6UYG42 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
读入 n 个整数
头插法依次建立单链表
读入位序 i
1 <= i <= 表长
输出 -1
从表头沿 next 指针前进 i-1 步
输出该结点的值
结束