剑指offer【c++】删除链表中重复的结点
题目:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:因为排序,所以可以在通过cur->next->next不断比较,将相同的数字所有的重复全部删除
代码一: 有三个指代参数
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
ListNode* pre = NULL;
ListNode* cur = pHead;//大循环,查找是否有重复数字
ListNode* res = NULL;// 小循环 查找重复数字出现多少个,全部去掉
if (pHead == NULL)
return NULL;
while(cur != NULL)
{
if (cur->next != NULL && cur->next->val == cur->val)// 遇到重复的
{
res = cur->next; // res 代表后面的结点,cur 保持不变
while(res->next != NULL && res->next->val == res->val)// 将所有重复的都遍历
res = res->next;
if(pHead == cur)
pHead = res->next;
else
pre->next = res->next;
cur = res->next;
}
else
{
pre = cur;
cur = cur->next;
}
}
return pHead;
}
};
代码二:有两个指代参数
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
ListNode* pre = NULL;
ListNode* cur = pHead;//大循环,查找是否有重复数字
//ListNode* res = NULL;// 小循环 查找重复数字出现多少个,全部去掉
if (pHead == NULL)
return NULL;
while(cur != NULL)
{
if (cur->next != NULL && cur->next->val == cur->val)// 遇到重复的
{
int temp = cur->val;
cur = cur->next; // res 代表后面的结点,cur 保持不变
while(cur->next != NULL && cur->next->val == cur->val)// 将所有重复的都遍历
cur = cur->next;
if(pre == NULL)
pHead = cur->next;
else
pre->next = cur->next;
}
else
pre = cur;
cur = cur->next;
}
return pHead;
}
};