/**
* 用链表实现 王道P41 T24
*
* ①算法思想:
* 首先创建一个(n+1)大小的数组,数组下标用来保存0到n大小的data,数组存储的元素用来标记此元素的abs是否出现过,刚开始初始化为 0;
* 然后断链,从头开始遍历,如果是第一次出现则插入,并将对应下标数组的元素设置为 1,如果不是第一次出现,则判断下一个,直到为空。
*
* ②数据结构:
* typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
*
* ③算法设计
*/
#include <stdio.h>
#include <iostream>
typedef struct LNode{
int data;
struct LNode* next;
}LNode,*LinkList;
void DeleteReAbs(LinkList &L,int n){
//创建n + 1 大小的数组
//这个数组下标可以保存 0 到 n 大小的数,和题目中说的data的绝对值小于 n 正好对应
int *flag = (int*)malloc(sizeof(int) * (n + 1));
//初始化数组
for(int i = 0; i < n + 1; i++){
flag[i] = 0;
}
//断链,如果符合条件再重新插入L
LinkList p = L -> next,q,r = L;
L -> next = NULL;
while(p){
q = p -> next;
if(flag[abs(p -> data)] == 0){//abs是取绝对值
r -> next = p;
r = p;
p = q;
flag[abs(p -> data)] = 1;
}else{
free(p);
p = q;
}
}
free(flag);
r -> next = NULL;
}
王道书P41 T24(单链表实现)
于 2022-07-12 19:25:47 首次发布