在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->3->4->5,c语言代码,输入样例1 1 2 2 3 4输出样例1 2 3 4
时间: 2024-05-10 16:21:21 浏览: 97
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* deleteDuplication(struct ListNode* pHead){
if(pHead == NULL || pHead->next == NULL) return pHead; // 链表为空或只有一个节点,直接返回
struct ListNode* pre = NULL; // 当前节点的前一个节点
struct ListNode* cur = pHead; // 当前节点
while(cur != NULL){
if(cur->next != NULL && cur->val == cur->next->val){ // 如果当前节点与下一个节点重复
int val = cur->val; // 记录重复的值
while(cur != NULL && cur->val == val){ // 将所有重复的节点全部删除
struct ListNode* temp = cur;
cur = cur->next;
free(temp);
}
if(pre == NULL){ // 如果重复的节点是链表的头节点,需要更新头指针
pHead = cur;
}else{
pre->next = cur; // 如果不是头节点,直接将前一个节点指向当前节点即可
}
}else{ // 如果当前节点与下一个节点不重复,直接将前一个节点指向当前节点,当前节点指向下一个节点
pre = cur;
cur = cur->next;
}
}
return pHead;
}
int main(){
struct ListNode *pHead = NULL; // 链表头指针
struct ListNode *pTail = NULL; // 链表尾指针
int val;
while(scanf("%d", &val) != EOF){ // 循环读取输入
struct ListNode *newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); // 新建节点
newNode->val = val;
newNode->next = NULL;
if(pHead == NULL){ // 如果链表为空,头指针和尾指针都指向新节点
pHead = pTail = newNode;
}else{ // 如果链表不为空,尾指针指向新节点,更新尾指针
pTail->next = newNode;
pTail = newNode;
}
}
pHead = deleteDuplication(pHead); // 调用函数删除重复节点
while(pHead != NULL){ // 循环输出链表中的元素
printf("%d ", pHead->val);
struct ListNode *temp = pHead;
pHead = pHead->next;
free(temp); // 释放节点内存
}
return 0;
}
```
阅读全文