C语言leetcode82
时间: 2023-11-23 20:52:42 浏览: 90
题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
解题思路:
- 定义一个虚拟头结点 dummy,使其 next 指向 head。
- 定义两个指针 pre 和 cur,其中 pre 指向虚拟头结点,cur 指向 head。
- 当 cur 不为空时,进行循环:
- 如果 cur 的值与 cur 的下一个节点的值相等,那么就将 cur 向后移动,直到 cur 的值与其下一个节点的值不相等为止。
- 如果 cur 的值与 cur 的下一个节点的值不相等,那么就将 pre 的下一个节点指向 cur,并将 pre 向后移动一位,cur 向后移动一位。
- 最后返回 dummy 的下一个节点即可。
参考代码:
struct ListNode* deleteDuplicates(struct ListNode* head){
struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
dummy->next = head;
struct ListNode* pre = dummy;
struct ListNode* cur = head;
while(cur != NULL){
if(cur->next != NULL && cur->val == cur->next->val){
while(cur->next != NULL && cur->val == cur->next->val){
cur = cur->next;
}
pre->next = cur->next;
}else{
pre = pre->next;
}
cur = cur->next;
}
return dummy->next;
}
阅读全文