题目: 删除排序链表中的重复元素
来自智得网
分析
方法一:使用双指针
思路:
首先,我们将链表中的指针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;
}
}
方法三:使用哈希表
思路:
我们可以使用哈希表来解决这个问题,首先我们定义一个哈希表,然后遍历整个链表,将链表中的元素添加到哈希表中,如果哈希表中已经有这个元素了,我们就将这个元素从链表中删除掉。