用单链表保存m个整数,结点的结构为: [data | link]且|data|≤n(n为正整数)。现要求设计一个时间复杂度尽可能高效的算法,对于链表中data的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。(1≤m,|n|≤10000)用c语言模拟链表并实现delet_node
时间: 2024-03-13 13:46:06 浏览: 144
实现在单链表中删去值相同的多余结点的算法.txt
好的,你的问题是关于单链表的算法,我会尽力回答。根据你的要求,我们需要遍历整个链表并记录每个出现的数据,以便删除后续的相同数据。具体的步骤如下:
1.定义一个数组count,用于记录每个数据出现的次数。
2.遍历链表,对于每个结点,将其数据的绝对值作为下标,在count数组中对应位置加1。
3.再次遍历链表,对于每个结点,查找其数据在count数组中对应的值,如果大于1,则说明该数据之前已经出现过,将该结点删除;否则继续遍历下一个结点。
代码实现如下(C语言):
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct ListNode {
int data;
struct ListNode *next;
} ListNode;
void deleteDuplication(ListNode *head, int n) {
int count[n + 1];
for (int i = 0; i <= n; ++i) {
count[i] = 0;
}
ListNode *cur = head, *prev = NULL;
while (cur) {
int index = abs(cur->data);
if (count[index] == 0) {
count[index] = 1;
prev = cur;
} else {
prev->next = cur->next;
free(cur);
}
cur = prev->next;
}
}
int main() {
ListNode *head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
ListNode *cur = head;
int m, n;
printf("请输入m和n:");
scanf("%d%d", &m, &n);
printf("请输入%d个整数:", m);
for (int i = 0; i < m; ++i) {
int x;
scanf("%d", &x);
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->data = x;
node->next = NULL;
cur->next = node;
cur = node;
}
deleteDuplication(head->next, n);
printf("删除重复元素后的链表为:");
cur = head->next;
while (cur) {
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
cur = head->next;
while (cur) {
ListNode *temp = cur;
cur = cur->next;
free(temp);
}
free(head);
return 0;
}
```
其中,head为单链表的头结点,n为数据的取值范围,即|n|。
需要注意的是,由于每个结点只能被访问一次,因此时间复杂度为O(m),其中m为链表的长度。
阅读全文