pta——链表去重

这篇博客探讨了如何通过使用数组来简化链表去重的难题。通过建立一个结构体数组,使得数组下标对应链表节点的地址,以此优化对下一个地址的查找过程。同时,利用另一大数组记录已出现的数值,达到空间换取时间效率的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
我们首先分析,这看似是链表,实则用数组很好写。
其地址都是整数,那我们创建一个很大的结构体数组,让其下标与地址对应,就可不费力的完成对下一地址的查找。
同理,对于数值是否重复,也可以创建一个大数组,用于记录出现过的数字。
即可实现空间换时间的美妙交换。

#include<stdio.h>
#include<assert.h>
#include <stdlib.h>
struct asd
{
   
	int num;
	int next;
};
int main()
{
   
	struct asd s[100000];//用于存储所有数据
	struct asd s1[100000];//用于存储重复数据
	int p[10001];//用于存储已经出现过的数值
	int n,m
### SDUT PTA 链表的实现方法 以下是基于C/C++和Python两种编程语言的链表实现方案。该问题的核心在于构建单链表并移除指定值的所有节点。 #### C/C++ 实现 在C/C++中,可以通过定义一个`struct`来表示链表节点,并通过指针操作完成链表的创建与修改。 ```c++ #include <iostream> using namespace std; // 定义链表节点结构体 struct Node { int data; struct Node* next; }; // 创建新节点 Node* createNode(int value) { Node* newNode = new Node(); newNode->data = value; newNode->next = nullptr; return newNode; } // 插入节点到链表末尾 void insertAtEnd(Node*& head, int value) { Node* newNode = createNode(value); if (head == nullptr) { head = newNode; // 如果头为空,则设置为新节点 } else { Node* temp = head; while (temp->next != nullptr) { // 找到最后一个节点 temp = temp->next; } temp->next = newNode; // 将新节点连接到最后 } } // 删除所有等于给定值m的节点 void deleteNodesWithValue(Node*& head, int m) { Node* current = head; Node* prev = nullptr; // 处理头部节点的情况 while (current && current->data == m) { head = current->next; delete current; current = head; } // 处理中间或尾部节点的情况 while (current) { if (current->data == m) { prev->next = current->next; delete current; current = prev->next; } else { prev = current; current = current->next; } } } // 输出链表内容 void printList(Node* head) { Node* temp = head; while (temp) { cout << temp->data << " "; temp = temp->next; } cout << endl; } ``` 上述代码实现了以下几个功能: 1. **创建链表节点**:函数 `createNode` 负责分配内存并初始化节点[^1]。 2. **插入节点至链表末尾**:函数 `insertAtEnd` 动态扩展链表长度。 3. **删除特定值的节点**:函数 `deleteNodesWithValue` 移除了所有值为`m`的节点。 4. **打印链表**:函数 `printList` 展示当前链表的内容。 --- #### Python 实现 在Python中,可以利用类来模拟链表的行为,简化了指针的操作过程。 ```python class ListNode: def __init__(self, val=0): self.val = val self.next = None def build_linked_list(values): dummy_head = ListNode(0) current = dummy_head for v in values: node = ListNode(v) current.next = node current = current.next return dummy_head.next def remove_nodes_with_value(head, m): dummy = ListNode(0) dummy.next = head current = dummy while current and current.next: if current.next.val == m: current.next = current.next.next # 跳过目标节点 else: current = current.next # 继续遍历下一个节点 return dummy.next def print_linked_list(head): result = [] while head: result.append(str(head.val)) head = head.next print(" ".join(result)) # 测试用例 values = [1, 2, 3, 2, 4, 2, 5] m = 2 initial_list = build_linked_list(values) print("Initial Linked List:") print_linked_list(initial_list) modified_list = remove_nodes_with_value(initial_list, m) print("Modified Linked List after removing", m, ":") print_linked_list(modified_list) ``` 此代码的功能如下: 1. **构建链表**:函数 `build_linked_list` 接收列表参数并将它们转换成链表形式。 2. **删除特定值的节点**:函数 `remove_nodes_with_value` 使用哑节点(dummy node)技术处理边界情况。 3. **打印链表**:函数 `print_linked_list` 提供了一种简洁的方式展示链表内容。 --- #### 总结 无论是C/C++还是Python,核心逻辑均围绕着动态数据结构——链表展开。对于SDUT PTA练习中的具体需求,需注意以下几点: - 输入部分应严格按照题目描述解析; - 构建链表时考虑带头节点的设计以减少特殊情况判断; - 删除操作需兼顾性能优化,避免不必要的复计算。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值