劍指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;
}
};