那么如何实现上面这个程序把绝对值相同的数据删除一个然后输出呢
时间: 2024-02-17 09:59:41 浏览: 14
好的,我们可以在遍历链表的同时,对于每个节点的值,判断其绝对值是否出现过,如果出现过则删除该节点,否则记录该节点的值,并继续遍历链表。具体实现步骤如下:
1. 定义一个数组 `absVals`,用来记录已经出现过的绝对值。
2. 定义指针 `p` 和 `pre`,分别指向当前节点和当前节点的前一个节点。
3. 遍历链表,对于每个节点,判断其值的绝对值是否已经出现过,如果出现过,则删除该节点,否则将该节点的值的绝对值记录在数组 `absVals` 中,并继续遍历下一个节点。
4. 如果删除了一个节点,则需要将指针 `pre` 的下一个节点指针 `next` 指向当前节点的下一个节点,然后释放当前节点的内存空间。
5. 最后遍历链表输出每个节点的值。
下面是一个实现了上述算法的 C 语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* createList(int arr[], int n) {
ListNode *head, *p, *q;
head = (ListNode *)malloc(sizeof(ListNode));
head->next = NULL;
p = head;
for (int i = 0; i < n; i++) {
q = (ListNode *)malloc(sizeof(ListNode));
q->val = arr[i];
q->next = NULL;
p->next = q;
p = q;
}
return head->next;
}
void removeDuplicates(ListNode *head) {
bool absVals[1001] = {false};
ListNode *p = head->next;
ListNode *pre = head;
while (p != NULL) {
int val = abs(p->val);
if (absVals[val]) { // 该绝对值已经出现过,需要删除该节点
pre->next = p->next;
free(p);
p = pre->next;
} else { // 该绝对值没有出现过,记录到数组中并继续遍历
absVals[val] = true;
pre = p;
p = p->next;
}
}
}
int main() {
int arr[] = {-1, 2, 3, 2, -3, 1, 4, 5, -5, -4};
int n = sizeof(arr) / sizeof(int);
ListNode *head = createList(arr, n);
removeDuplicates(head);
ListNode *p = head;
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
return 0;
}
```
这个程序首先定义了一个数组 `absVals`,用来记录已经出现过的绝对值。然后在 `removeDuplicates` 函数中遍历链表,对于每个节点,判断其值的绝对值是否已经出现过。如果出现过,则删除该节点;否则将该节点的值的绝对值记录在数组 `absVals` 中,并继续遍历下一个节点。最后在 `main` 函数中调用 `createList` 函数创建单链表,然后调用 `removeDuplicates` 函数删除绝对值相同的节点,最后遍历链表输出每个节点的值。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)