给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。写出C语言代码
时间: 2024-09-21 10:03:23 浏览: 42
当你需要从一个已排序的链表中删除重复元素并保持链表有序时,可以采用双指针策略,同时遍历链表。这里是一个简单的C语言解决方案:
```c
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* deleteDuplicates(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head; // 如果链表为空或只有一个元素,则无需处理
}
ListNode* slow = head;
ListNode* fast = head->next;
while (fast != NULL && fast->next != NULL) { // 使用两个指针,slow移动一步,fast移动两步
if (fast->val != slow->val) { // 如果值不同,将slow指向的节点移到下一个位置
slow->next = fast;
}
fast = fast->next->next; // 快速指针前进一步
}
if (fast != NULL && fast->val == slow->val) { // 处理最后一个可能存在的重复节点
slow->next = fast->next;
} else {
slow->next = NULL; // 如果只剩一个元素或已经到达链表尾部,将慢指针设为NULL
}
return head;
}
```
这个函数会遍历链表,如果当前节点的值等于下一个节点的值,就跳过下一个节点;如果不等,则将当前节点的`next`指向前一个节点。最后返回新的头节点。
阅读全文