c语言,给定一个已排序的链表head , 删除原始链表中所有重复数字的节点,返回执行删除后的链表 。【保证链表已经按升序排列】】,输入:输入链表的元素(链表长度大于等于0);输出:输出执行删除后的链表元素。(若删除后链表长度为0,则什么都不输出);【样例输入】 1 2 3 3 4 4 5 【样例输出】 1 2 5
时间: 2023-06-10 08:03:25 浏览: 135
算法:给定一个链表,判断链表中是否存在环
好的,针对您的问题,我理解您需要我给出一个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
请问,有没有理解不对的地方?
阅读全文