一、题目描述
二、算法步骤
本题可以用空间换时间的方法,用数组a存放链表中每个数绝对值的出现次数,如果出现不止一次则对相应的链表节点进行删除操作;在删除时,需要一个prev指针,保存当前cur指针的前一个节点,方便与后续节点进行链接。
完成代码如下:
#include
#include
#include
using namespace std;
typedef int elementType;
typedef struct Node //节点数据结构定义
{
elementType data;
struct Node* link;
}Node,LinkList;
const int N = 100;
int a[N]; //记录出现数字出现次数
Node* Init(LinkList* L)
{
L = (LinkList*)malloc(sizeof(Node));
L->data = 0;
L->link = NULL;
return L;
}
Node* Create(int x)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = x;
newNode->link = NULL;
return newNode;
}
void Print(LinkList* L)
{
Node* cur = L;
cur = cur->link;
while (cur!= NULL)
{
cout << cur->data;
if(cur->link!=NULL)printf("->");
cur = cur->link;
}
printf("\n");
}
int main()
{
///
///链表初始化
///
///
LinkList* L = NULL;
L = Init(L);
int n; cin >> n;
Node* cur = L;
for (int i = 0; i < n; i++)
{
elementType x; cin >> x;
Node* newNode = Create(x);
cur->link = newNode;
cur = cur->link;
}
cout << "L1为" << endl; Print(L);
///
/// 解法步骤
///
///
cur = L->link;
Node* prev = NULL;
while (cur)
{
if (a[abs(cur->data)] == 0) { a[abs(cur->data)]++; }
else
{
prev->link= cur->link; //首先前一个指向后一个
free(cur); //释放当前节点
cur = prev; //当前节点倒推回前一个节点
}
prev = cur;//更新前一个节点
cur = cur->link;//使当前节点后移
}
Print(L);//最后打印一下
return 0;
}
结果展示:
```cpp
5
21 -15 -15 -7 15
L1为
21->-15->-15->-7->15
21->-15->-7
# 三、总结
本题较为简单,注意空间换时间的思想,然后就是删除节点的时候要注意保存前一个节点。
- THE END -
最后修改:2024年2月11日