题目: 删除排序链表中的重复元素

来自智得网
跳转至: 导航、​ 搜索

分析

方法一:使用双指针

思路:

首先,我们将链表中的指针p指向链表的头节点,指针q指向p的下一个节点。接着,我们使用双指针的方法,不断地遍历链表,如果p和q所指向的节点的值相等,我们就将p的next指针指向q的next指针,这样就可以将重复的节点删除掉,如果不相等,我们就将p和q两个指针都向后移动一位,直到q指向了链表的尾节点。

代码实现:

ListNode* deleteDuplicates(ListNode* head) {
    if(head == nullptr) return nullptr;
    ListNode* p = head, *q = head->next;
    while(q != nullptr) {
        if(p->val == q->val) {
            p->next = q->next;
        }
        else {
            p = q;
        }
        q = q->next;
    }
    return head;
}

方法二:递归

思路:

我们可以使用递归的方法解决这个问题。首先我们要考虑递归的结束条件,如果链表为空,或者链表中只有一个节点,那么这个链表就是排好序的。接着,我们判断链表的第一个节点和第二个节点是否相等,如果相等,我们就将第二个节点删掉,然后对剩下的链表进行递归操作,如果不相等,我们就对第二个节点后面的链表进行递归操作。

代码实现:

ListNode* deleteDuplicates(ListNode* head) {
    if(head == nullptr || head->next == nullptr) return head;
    if(head->val == head->next->val) {
        ListNode* p = head->next;
        while(p != nullptr && head->val == p->val) {
            p = p->next;
        }
        return deleteDuplicates(p);
    }
    else {
        head->next = deleteDuplicates(head->next);
        return head;
    }
}

方法三:使用哈希表

思路:

我们可以使用哈希表来解决这个问题,首先我们定义一个哈希表,然后遍历整个链表,将链表中的元素添加到哈希表中,如果哈希表中已经有这个元素了,我们就将这个元素从链表中删除掉。