题目:
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
注意:链表已经排序,排序,排序
无排序是另外一种解法;
方法:引入pre指针+next指针。穿针引线法
函数代码:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head||!head->next)
{
return head;
}
ListNode *cur=head;
ListNode *p=head;
while(cur->next!=NULL&&cur!=NULL)
{
//p为当前结点的下一个结点,判断当前结点和下一个结点的值是否重复
p=cur->next;
if(cur->val==p->val)
{
cur->next=p->next;
p=p->next;
//如果把p=p->next,改为cur=cur->next,就会报错,在while(cur->next)
//运行时错误:成员访问类型为空指针'ListNode'
}
else
{
cur=cur->next;
}
}
return head;
}
};
函数代码二:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head || !head->next) return head;
ListNode *pre = head;
while(pre&&pre->next)
{
ListNode *cur = pre->next;
if(cur->val == pre->val)
{
pre->next = cur->next;
cur=cur->next;
}
// 注意,题目给的是已排好序的链表,所以一旦cur和pre的值不等,那么后面全部都不会出现和当前pre的值相等的元素了,所以pre可以往后移动一位
else
{
pre = pre-> next;
}
}
return head;
}
};
函数代码三:在if语句中分配下一个结点+delete
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head)
{
return head;
}
ListNode *cur=head;
while(cur&&cur->next)
{
if(cur->val==cur->next->val)
{
ListNode *next=cur->next;
cur->next=next->next;
delete next;
}
else
{
cur=cur->next;
}
}
return head;
}
};
函数代码三:注释版
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head)
{
//如果所给链表为空直接返回,否则在执行ptr->next这部操作时会因为ptr为NULL而造成执行时错误
if(head == NULL)
{
return head;
}
ListNode* ptr=head;
//遍历的指针
while (ptr->next != NULL)
{
//遍历首个元素到第倒数第二个元素,因为是逐个向后比较,最后一个元素会被比较到,这样是正确的
if (ptr->val == ptr->next->val)
{
//和后一个元素比较
ListNode* p = ptr->next;
//删除操作
ptr->next = p->next;
//释放空间
delete p;
}
else
{
//移动到后一个元素
ptr = ptr->next;
}
}
//返回首个节点
return head;
}
};