朋友留言-->

欢迎您的到来, 如果您对我或本Blog有任何意见或建议, 可以在此与我交流!

陈亚平   (Apenni)

QQ:  27286498

Mail: cyp403@hotmail.com

Software Engineer!                     Thx for u !       
题目:新建链表-头插+尾插法 描述: 头插+尾插法建立单链表 【问题描述】 小明尝试用头插法和尾插法建立一个单链表,从空表开始, 他每次输入两个整数 p,q,其中 p 是插入的类型(1 表示头插法,2 表示尾插法),q 是插入的元素。 例如假设单链表 t 最初为空,即[], 若用户输入 1 5 ,表示用头插法插入元素5, 则单链表 t 的内容为 [5] 请编写C++程序实现上述过程。 【输入格式】 用户输入若干行, 每一行有两个格式: 如果包含两个整数p,q,用空格分隔,则 p=1 表示头插法,p=2 表示尾插法插入元素q; 如果只包含一个整数p, 且p不是1或者2,则表示插入操作结束。 【输出格式】 每一次插入操作后,打印当前单链表的内容,例如: [->5->6->8] 单链表的内容用[]包裹,每个元素之前用->表示链。 【样例输入】 1 5 2 8 1 6 0 【样例输出】 [->5] [->5->8] [->6->5->8] 【样例输入】 1 9 2 8 1 7 2 6 2 5 1 10 1 4 2 3 2 2 1 1 1 10 2 11 -1 【样例输出】 [->9] [->9->8] [->7->9->8] [->7->9->8->6] [->7->9->8->6->5] [->10->7->9->8->6->5] [->4->10->7->9->8->6->5] [->4->10->7->9->8->6->5->3] [->4->10->7->9->8->6->5->3->2] [->1->4->10->7->9->8->6->5->3->2] [->10->1->4->10->7->9->8->6->5->3->2] [->10->1->4->10->7->9->8->6->5->3->2->11] 【样例输入】 2 4 1 3 1 6 1 1 2 5 1 2 3 【样例输出】 [->4] [->3->4] [->6->3->4] [->1->6->3->4] [->1->6->3->4->5] [->2->1->6->3->4->5]
最新发布
04-01
以下是针对“头插+尾插法建立单链表”问题的解答,并附上完整的 C++ 程序实现: ### 解题思路 1. **定义节点结构**:首先需要定义一个 `Node` 结构体,用于存储数据和指向下一个节点的指针。 2. **初始化链表**:创建一个初始为空的单链表,设置头部节点为 `NULL` 或虚拟头节点。 3. **头插法**:将新节点插入到链表的第一个位置,使其成为新的首节点。这一步只需要修改新节点的 `next` 和原链表头的关系即可。 4. **尾插法**:遍历整个链表找到最后一个节点,然后将其 `next` 指向新节点完成插入操作。 5. **动态更新并输出结果**:每插入一个新的节点后,都需要重新遍历链表并将所有节点值按照指定格式打印出来。 下面是基于以上逻辑的具体代码实现: ```cpp #include <iostream&gt; using namespace std; // 定义链表节点 struct Node { int data; Node* next; }; void insertHead(Node*& head, int value) { // 创建新节点 Node* newNode = new Node(); newNode-&gt;data = value; newNode-&gt;next = head; // 新节点指向原来的head head = newNode; // 更新head为新节点 } void insertTail(Node*& head, int value) { // 创建新节点 Node* newNode = new Node(); newNode-&gt;data = value; newNode-&gt;next = nullptr; if (head == nullptr) { // 如果链表为空,直接将newNode作为head head = newNode; } else { // 找到最后一个节点 Node* temp = head; while (temp-&gt;next != nullptr) { temp = temp-&gt;next; } temp-&gt;next = newNode; // 插入新节点 } } void printList(const Node* head) { cout << "["; bool first = true; for (const Node* current = head; current != nullptr; current = current-&gt;next) { if (!first) cout << "-&gt;"; cout << current-&gt;data; first = false; } cout << "]" << endl; } int main() { Node* head = nullptr; // 初始化链表为空 while (true) { int p, q; cin &gt;&gt; p; if ((p != 1 && p != 2)) break; // 当p不是1或2时退出循环 cin &gt;&gt; q; // 输入第二个数字q作为待插入的数据 if (p == 1) { insertHead(head, q); // 使用头插法 } else if (p == 2) { insertTail(head, q); // 使用尾插法 } printList(head); // 输出当前链表状态 } return 0; } ``` --- #### 示例运行说明: 对于给定样例输入: ``` 1 5 2 8 1 6 0 ``` 程序会依次生成如下的输出结果: ``` [-&gt;5] [-&gt;5-&gt;8] [-&gt;6-&gt;5-&gt;8] ``` 当读取到非合法命令(如 `0`)时停止接收输入。 --- ### §相关问题§: 1. 能否优化此算法的时间复杂度?如何减少不必要的遍历? 2. 如果需要支持删除特定数值的操作,应该如何调整现有函数设计? 3. 怎么样通过递归的方式改写该链表构造方法?
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值