文章
61
粉丝
0
获赞
0
访问
3.5k
⑴ 算法的基本设计思想(3分)
为了在时间复杂度上尽可能高效,我们采用以下策略:
使用辅助空间(哈希表)记录已出现的绝对值: 创建一个哈希表(或布尔数组),大小为 n+1,用来标记每个绝对值是否已经出现过。这里利用了题目中 |data|≤n
的条件,确保可以使用大小为 n+1 的数组来记录。
遍历链表,处理每个结点: 从链表头开始,逐个结点遍历。
data
绝对值在哈希表中未被标记,则保留该结点,并在哈希表中标记该绝对值。data
绝对值在哈希表中已被标记,则删除该结点。注意删除操作的指针维护: 在删除结点时,需要正确地维护链表的指针,确保链表不会断裂。因此,需要记录当前结点的前驱结点。
(2)
typedef struct Node{
int data;
struct Node *next;
}Node,*Linklist
(3)
#include <iostream>
#include <cmath> // for abs()
#include <vector> // for boolean vector
using namespace std;
void removeDuplicateAbs(LinkedList &head, int n) {
if (head == nullptr || head->next == nullptr) return; // 链表为空或只有一个结点,无需处理
vector<bool> appeared(n + 1, false); // 哈希表(布尔数组),标记绝对值是否出现
Node *curr = head; // 当前结点
Node *prev = nullptr; // 前驱结点
while (curr != nullptr) {
int absData = abs(...
登录后发布评论
暂无评论,来抢沙发