用c语言实现给定一个已排序的链表的头 head,删除所有重复的元素,使每个元素只出现一次。返回 已排序的链表。
时间: 2024-05-10 14:17:18 浏览: 7
以下是用C语言实现的代码:
```c
struct ListNode* deleteDuplicates(struct ListNode* head) {
if (head == NULL) {
return NULL;
}
struct ListNode* cur = head;
while (cur->next != NULL) {
if (cur->val == cur->next->val) {
struct ListNode* temp = cur->next;
cur->next = cur->next->next;
free(temp);
} else {
cur = cur->next;
}
}
return head;
}
```
这段代码使用了双指针的方法,遍历链表中的每个节点,如果当前节点的值等于下一个节点的值,就将下一个节点删除,直到链表末尾。最后返回已排序的链表。
需要注意的是,当删除节点时需要释放节点的内存空间,以免出现内存泄漏问题。同时,需要考虑链表为空的情况,如果链表为空,则直接返回NULL。
相关问题
删除给定链表中的重复元素(链表中元素从小到大有序排列),使链表中的所有元素都只出现一次,C语言实现
假设链表节点的结构体如下:
```c
struct ListNode {
int val;
struct ListNode *next;
};
```
则可以按照以下步骤实现链表中重复元素的删除:
1. 如果链表为空或只有一个节点,直接返回链表。
2. 定义一个指针p,初始指向链表的第一个节点。
3. 遍历链表,如果当前节点的值和下一个节点的值相等,则删除下一个节点(即将当前节点的next指针指向下一个节点的next指针),继续判断下一个节点。如果不相等,则将p指针指向下一个节点,继续遍历。
4. 返回链表的头节点。
具体代码实现如下:
```c
struct ListNode* deleteDuplicates(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode *p = head;
while (p->next != NULL) {
if (p->val == p->next->val) {
p->next = p->next->next;
} else {
p = p->next;
}
}
return head;
}
```
给定一个已排序的链表head , 删除原始链表中所有重复数字的节点,返回执行删除后的链表 。【保证链表已经按升序排列】】(c语言)
好的,我能够回答这个问题。这个问题属于数据结构和算法的范畴。我们需要遍历这个链表,判断当前节点的值是否与上一个节点的值相同,如果相同,则删除这个节点;否则继续向后遍历。这里需要注意的是,头节点可能会被删除,因此我们需要使用一个虚拟头节点来简化链表的操作。具体实现过程可以参考以下的C语言代码:
```
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head){
if (!head) {
return NULL;
}
struct ListNode* dummy = malloc(sizeof(struct ListNode));
dummy->val = -1;
dummy->next = head;
struct ListNode* prev = dummy;
struct ListNode* curr = head;
while (curr) {
if (curr->next && curr->next->val == curr->val) {
while (curr->next && curr->next->val == curr->val) {
curr = curr->next;
}
prev->next = curr->next;
} else {
prev = prev->next;
}
curr = curr->next;
}
return dummy->next;
}
```