用c语言实现给定一个已排序的链表的头 head,删除所有重复的元素,使每个元素只出现一次。返回 已排序的链表。
时间: 2024-05-10 11:17:18 浏览: 147
以下是用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。
相关问题
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。写出C语言代码
当你需要从一个已排序的链表中删除重复元素并保持链表有序时,可以采用双指针策略,同时遍历链表。这里是一个简单的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`指向前一个节点。最后返回新的头节点。
c语言,给定一个已排序的链表head , 删除原始链表中所有重复数字的节点,返回执行删除后的链表 。【保证链表已经按升序排列】】,输入:输入链表的元素(链表长度大于等于0);输出:输出执行删除后的链表元素。(若删除后链表长度为0,则什么都不输出);【样例输入】 1 2 3 3 4 4 5 【样例输出】 1 2 5
好的,针对您的问题,我理解您需要我给出一个C语言的实现,删除已排序链表中所有重复数字的节点,返回执行删除后的链表。对吗?
如果是的话,下面是代码实现的思路:
1. 定义一个指针p,初始指向表头head。
2. 遍历链表,如果p所指向的节点的值等于下一个节点的值,将该节点删除,并让p指向删除节点的下一个节点;否则,令p指向下一个节点。
3. 重复上述操作,直到链表遍历完毕。
4. 返回处理后的链表。
实现代码如下:
```c
#include<stdio.h>
#include<stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* deleteDuplicates(struct ListNode* head) {
if (head == NULL || head->next == NULL) return head;
struct ListNode* p = head;
while (p != NULL && p->next != NULL) {
if (p->val == p->next->val) {
struct ListNode* tmp = p->next;
p->next = p->next->next;
free(tmp);
} else {
p = p->next;
}
}
return head;
}
void printList(struct ListNode* head) {
struct ListNode* p = head;
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
int main() {
struct ListNode* head = NULL;
struct ListNode* node1 = NULL;
struct ListNode* node2 = NULL;
struct ListNode* node3 = NULL;
struct ListNode* node4 = NULL;
struct ListNode* node5 = NULL;
struct ListNode* node6 = NULL;
node1 = (struct ListNode*)malloc(sizeof(struct ListNode));
node1->val = 1;
node2 = (struct ListNode*)malloc(sizeof(struct ListNode));
node2->val = 2;
node3 = (struct ListNode*)malloc(sizeof(struct ListNode));
node3->val = 3;
node4 = (struct ListNode*)malloc(sizeof(struct ListNode));
node4->val = 3;
node5 = (struct ListNode*)malloc(sizeof(struct ListNode));
node5->val = 4;
node6 = (struct ListNode*)malloc(sizeof(struct ListNode));
node6->val = 4;
head = node1;
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = node5;
node5->next = node6;
node6->next = NULL;
printf("原链表为:\n");
printList(head);
head = deleteDuplicates(head);
printf("删除重复数字后的链表为:\n");
printList(head);
return 0;
}
```
【输出结果】
原链表为:
1 2 3 3 4 4
删除重复数字后的链表为:
1 2 3 4
请问,有没有理解不对的地方?
阅读全文