1. 删除链表中相邻的重复的点(若重复,则保留一个)
C++代码:
void DeleteDuplication(ListNode* &pHead) {// 删除链表中相邻的重复结点(保留一个)
if(NULL == pHead) return;
ListNode *p1 = pHead, *p2 = p1->next;
while(p2 != NULL) {
if(p2->val == p1->val) {
while(p2 != NULL && p2->val == p1->val) {
ListNode* p = p2;
p2 = p2->next;
p = NULL;
}
p1->next = p2;
}
if(NULL != p2)
p2 = p2->next;
p1 = p1->next;
}
}
2. 删除链表中重复的点(若重复,则保留一个)
void DeleteDuplication2(ListNode* &pHead) {// 删除链表中重复结点(保留一个)
if(NULL == pHead) return;
set<int> s;
s.insert(pHead->val);
ListNode* p = pHead, *pNode = pHead->next;
while(pNode != NULL) {
if(s.find(pNode->val) == s.end()) {
s.insert(pNode->val);
p->next = pNode;
p = p->next;
pNode = pNode->next;
} else {
ListNode* q = pNode;
pNode = q->next;
delete q;
q = NULL;
p->next = NULL;
}
}
}
3. 删除链表中相邻的重复的点
C++代码:
void deleteDuplication(ListNode* &pHead) {// 删除链表中相邻的重复结点
if(NULL == pHead) return;
ListNode *pPre = NULL, *pNode = pHead;
while(pNode != NULL) {
ListNode* pNext = pNode->next;
if(pNext != NULL && pNext->val == pNode->val) {
const int val = pNode->val;
ListNode* p = pNode;
while(p != NULL && val == p->val) {
pNext = p->next;
delete p;
p = pNext;
}
if(NULL == pPre)
pHead = pNext;
else
pPre->next = pNext;
pNode = pNext;
} else {
pPre = pNode;
pNode = pNode->next;
}
}
}