题目描述
求单向链表中间的节点值,如果奇数个节点取中间,偶数个取偏右边的那个值。
输入描述
第一行 链表头节点地址 后续输入的节点数n
后续输入每行表示一个节点,格式 节点地址 节点值 下一个节点地址(-1表示空指针)
输入保证链表不会出现环,并且可能存在一些节点不属于链表。
输出描述
单向链表中间的节点值
用例
输入 | 00010 4 00000 3 -1 00010 5 12309 11451 6 00000 12309 7 11451 |
输出 | 6 |
说明 | 无 |
输入 | 10000 3 76892 7 12309 12309 5 -1 10000 1 76892 |
输出 | 7 |
说明 | 无 |
问题解析
题目要求找到单向链表的中间节点值。如果链表节点数为奇数,则取中间值;如果为偶数,则取偏右边的那个值。
输入描述
- 第一行:链表头节点地址和节点数量 n。
- 后续 n 行:每行表示一个节点,格式为
节点地址 节点值 下一节点地址
。
输出描述
单向链表中间的节点值。
实现思路
- 读取输入数据并解析链表节点信息。
- 使用一个哈希表(字典)来存储节点地址和对应的节点信息。
- 从头节点开始遍历链表,生成一个节点值列表。
- 根据节点值列表的长度,计算并输出中间节点的值。
步骤
- 读取链表头节点地址和节点数量。
- 读取节点信息并存储到字典中。
- 从头节点开始遍历链表,记录节点值。
- 计算中间节点的索引并输出相应的节点值。
C++ 实现
以下是实现该逻辑的 C++ 代码:
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
struct Node {
int address;
int value;
int next;
};
int main() {
int head_address, n;
cin >> head_address >> n;
unordered_map<int, Node> nodes;
for (int i = 0; i < n; ++i) {
int address, value, next;
cin >> address >> value >> next;
nodes[address] = {address, value, next};
}
vector<int> values;
int current = head_address;
while (current != -1) {
values.push_back(nodes[current].value);
current = nodes[current].next;
}
int mid_index = values.size() / 2;
cout << values[mid_index] << endl;
return 0;
}
代码说明
- Node 结构体:用于存储节点信息,包括节点地址、节点值和下一节点地址。
- main 函数:
- 读取链表头节点地址和节点数量。
- 使用
unordered_map
存储节点信息。 - 遍历链表生成节点值列表。
- 计算并输出中间节点值。
示例输入输出
- 输入:
00010 4
00000 3 -1
00010 5 12309
11451 6 00000
12309 7 11451
- 输出:
6
该程序能够根据输入的链表节点信息正确计算并输出链表中间节点的值。如果链表节点数为奇数,则取中间值;如果为偶数,则取偏右边的那个值。
Python 实现
def main():
import sys
input = sys.stdin.read
data = input().splitlines()
head_address, n = data[0].split()
head_address = int(head_address)
n = int(n)
nodes = {}
for i in range(1, n + 1):
address, value, next_address = data[i].split()
address = int(address)
value = int(value)
next_address = int(next_address)
nodes[address] = {'value': value, 'next': next_address}
values = []
current = head_address
while current != -1:
values.append(nodes[current]['value'])
current = nodes[current]['next']
mid_index = len(values) // 2
print(values[mid_index])
if __name__ == "__main__":
main()
代码说明
- 输入处理:读取链表头节点地址和节点数量,然后读取每个节点的信息并存储到字典中。
- 节点遍历:从头节点开始遍历链表,记录所有节点的值。
- 中间节点计算:根据记录的节点值列表长度,计算并输出中间节点的值。
使用示例
运行程序时,将按照下述步骤操作:
- 输入链表头节点地址和节点数量。
- 输入每个节点的地址、值和下一节点地址。
- 程序将输出链表中间节点的值。
示例输入:
00010 4
00000 3 -1
00010 5 12309
11451 6 00000
12309 7 11451
示例输出:
6
该程序能够根据输入的链表节点信息正确计算并输出链表中间节点的值。如果链表节点数为奇数,则取中间值;如果为偶数,则取偏右边的那个值。