删除链表中的重复元素c语言
时间: 2023-09-30 12:03:26 浏览: 469
以下是删除链表中重复元素的C语言代码:
```c
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* deleteDuplicates(struct ListNode* head) {
if (head == NULL) {
return head;
}
struct ListNode* cur = head;
while (cur->next != NULL) {
if (cur->val == cur->next->val) {
struct ListNode* tmp = cur->next;
cur->next = cur->next->next;
free(tmp);
} else {
cur = cur->next;
}
}
return head;
}
```
首先判断链表是否为空,如果为空直接返回,否则将链表头结点赋值给 cur。遍历链表,如果当前结点的值等于下一个结点的值,说明有重复元素,将下一个结点从链表中删除,并释放其内存空间;否则,继续遍历链表。最后返回链表的头结点即可。
相关问题
用c语言表示一个链表可以删除链表中重复元素
在C语言中,你可以使用结构体定义链表节点,并提供一个函数来删除链表中的重复元素。首先,我们定义链表节点结构:
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
```
接下来,创建一个函数`deleteDuplicates`,它接受链表头指针作为参数,并遍历链表,如果发现相同的元素,就将重复部分连接到当前元素之后:
```c
void deleteDuplicates(Node** head) {
if (*head == NULL || (*head)->next == NULL) {
return; // 如果链表为空或只有一个元素,无需处理
}
Node* current = *head;
Node* runner = current->next;
while (runner != NULL) {
if (current->data == runner->data) {
// 找到重复元素,跳过并继续检查下一个
runner = runner->next;
} else {
current->next = runner;
current = runner;
runner = runner->next;
}
}
current->next = NULL; // 结束循环后,将最后一个节点的next设为NULL
}
```
这个函数假设数据类型的比较是基于值相等。如果你需要基于其他条件判断,例如字符串或自定义对象,你需要相应地修改比较部分。
C语言有序链表删除重复元素
在C语言中,如果要删除有序链表中的重复元素,可以采用遍历链表的方式。以下是基本步骤:
1. 定义一个结构体,表示链表节点,包含数据和指向下一个节点的指针。
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
```
2. 创建一个函数,用于删除重复的元素。这里会创建两个指针,一个当前指针`current`和一个前驱指针`prev`。当遇到相同的元素时,跳过它并继续检查下一个节点。
```c
void removeDuplicates(Node** head) {
if (*head == NULL || (*head)->next == NULL) {
return;
}
Node* current = *head;
Node* prev = NULL;
while (current != NULL && current->next != NULL) {
if (current->data == current->next->data) {
Node* temp = current->next;
current->next = current->next->next;
free(temp); // 释放重复元素的内存
prev = current; // 非重复元素向前移动
current = current->next;
} else {
prev = current;
current = current->next;
}
}
}
```
3. 在函数结束时,记得处理链表尾部的情况,如果最后一个节点的数据和前一个节点相同,也需要移除并释放内存。
```c
if (prev != NULL && current != NULL && prev->data == current->data) {
free(current);
}
```
4. 调用这个函数时,传入链表头指针即可开始操作:
```c
Node* list = createLinkedList(); // 初始化链表...
removeDuplicates(&list);
```
阅读全文