本文主要是介绍【C++】每日一题 82 删除排序链表中的重复元素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
class ListNode {
public:int val;ListNode* next;ListNode(int _val) {val = _val;next = nullptr;}
};ListNode* deleteDuplicates(ListNode* head) {if (head == nullptr || head->next == nullptr) {return head;}ListNode dummy(0);dummy.next = head;ListNode* pre = &dummy;ListNode* cur = head;while (cur != nullptr) {bool duplicated = false;while (cur->next != nullptr && cur->val == cur->next->val) {duplicated = true;ListNode* temp = cur;cur = cur->next;delete temp;}if (duplicated) {pre->next = cur->next;delete cur;cur = pre->next;} else {pre = cur;cur = cur->next;}}return dummy.next;
}
通过使用双指针 pre 和 cur 遍历链表,同时使用一个布尔变量 duplicated 来标记当前节点是否为重复节点。在遍历过程中,如果发现当前节点与下一个节点值相同,则将 duplicated 设置为 true,直到找到不同值的节点或遍历结束。接着根据 duplicated 的值来删除重复节点或保留不同节点,并更新指针位置,直至遍历完成。最终返回处理后的链表头节点
具体的删除步骤如下:
初始化双指针 pre 和 cur,并将 pre 指针指向一个虚拟头节点。
将 cur 指针指向 head,开始遍历链表。
在遍历过程中,发现 cur->val 与 cur->next->val 相同,即 3 == 3,则将 duplicated 设置为 true,并删除重复节点 3 和 3。
更新指针位置,将 pre->next 指向下一个不重复的节点 4,并删除重复节点 4。
继续遍历,发现 cur->val 与 cur->next->val 不相同,即 4 != 5,则保留节点 5。
完成遍历后,返回处理后的链表头部,即 [1,2,5]。
这篇关于【C++】每日一题 82 删除排序链表中的重复元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!