题目1:给定一个已排序的链表的头 head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。(重复元素不全部都删除,需要保留一个)
解题思路:
遍历链表,找到重复元素后删除节点,注意删除的节点是重复元素中除去第一个节点的其余节点
源代码如下:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL)//链表为空返回空
return head;
ListNode* pre=head;//定义一个指针,从头节点开始遍历
//当pre->next=NULL时,说明pre已经到链表的最后一个节点了,就结束循环
while(pre->next!=NULL)
{
if(pre->val==pre->next->val)//当前节点的值等于下一个节点的值
{
//删除下一个节点
pre->next=pre->next->next;
}
//当前节点与下一个节点值不相同,节点往后移一位
else
{
pre=pre->next;
}
}
//返回头节点
return head;
}
};
题目2:给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
解题思路:
1.因为要删除全部的重复元素,如果遇到头节点为第一个重复元素的情况时就删不干净,所以我们设置一个哑节点dummy
2.将dummy添加到头节点之前,从dummy节点开始遍历,这样可以将原头节点也一并删掉
3.在遇到有多个重复元素时,我们可以设置一个while循环,找到重复元素中的最后一个节点,一次性将所有重复节点删除
源代码如下:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==nullptr||head->next==nullptr) return head;
//因为要求将重复元素全部删除,所以要多设置一个节点,添加在头节点之前
ListNode* dummy=new ListNode(0,head);//在head头节点之前增加一个哑节点dummy
ListNode* pre=dummy;
while(pre->next&&pre->next->next)
{
//找到重复元素
if(pre->next->val==pre->next->next->val)
{
//将重复元素的val值保存下来
int x=pre->next->val;
//删除所有重复元素
while(pre->next&&pre->next->val==x)
{
//注意这里删除的实质是pre->next这个节点
pre->next=pre->next->next;
}
}
//没有重复元素,继续往下找
else
{
pre=pre->next;
}
}
//返回头节点
return dummy->next;
}
};