C语言删除顺序表的重复元素
时间: 2024-11-10 19:12:41 浏览: 3
C语言 使用自定义顺序表实现非递减顺序表合并
在C语言中,删除顺序表(通常指数组或链表)中的重复元素可以采用几种不同的方法,这里以链表为例,因为删除操作在这类数据结构中更为常见。
1. **遍历法**:
- 首先,创建两个指针 `current` 和 `temp`,初始化为头节点。
- 循环遍历链表,如果当前节点的数据与下一个节点的数据相同,则将下一个节点(重复项)从链表中移除,即将 `temp` 指向下一个节点,并将其后续节点设置为 `current->next`。
- 然后,`current` 向前移动一位,继续比较。
- 当所有节点都检查过后,链表中就不会有重复元素了。
```c
void removeDuplicates(Node** head) {
if (*head == NULL || (*head)->data == NULL) return;
Node* current = *head;
Node* temp = NULL;
while (current != NULL && current->next != NULL) {
if (current->data == current->next->data) {
temp = current->next;
current->next = current->next->next;
free(temp); // 释放重复节点的内存
} else {
current = current->next;
}
}
}
```
2. **额外存储空间法**:
如果允许使用额外的空间,可以创建一个新的链表来存放非重复元素,然后逐个复制原链表中不重复的部分到新链表。
```c
Node* deleteDuplicates(Node* head) {
if (head == NULL || head->next == NULL) return head;
Node* temp = head;
Node* newHead = NULL;
Node* newTail = NULL;
while (temp != NULL) {
if (newTail == NULL || temp->data != newTail->data) {
newTail->next = temp;
newTail = temp;
}
temp = temp->next;
}
newTail->next = NULL; // 结束新链表
head = newHead;
return head;
}
```
阅读全文