#include<iostream>
#include <hash_map>
using namespace std;
struct ListNode{
int m_nValue;
ListNode* m_pNext;
};
ListNode* CreateListNode(int value)
{
ListNode* pNode = new ListNode();
pNode->m_nValue = value;
pNode->m_pNext = NULL;
return pNode;
}
void ConnectListNodes(ListNode* pCurrent, ListNode* pNext)
{
if (pCurrent == NULL)
{
printf("Error to connect two nodes.\n");
exit(1);
}
pCurrent->m_pNext = pNext;
}
void PrintListNode(ListNode* pNode)
{
if (pNode == NULL)
{
printf("The node is NULL\n");
}
else
{
printf("The key in node is %d.\n", pNode->m_nValue);
}
}
void PrintList(ListNode* pHead)
{
printf("PrintList starts.\n");
ListNode* pNode = pHead;
while (pNode != NULL)
{
printf("%d\t", pNode->m_nValue);
pNode = pNode->m_pNext;
}
printf("\nPrintList ends.\n");
}
void DestroyList(ListNode* pHead)
{
ListNode* pNode = pHead;
while (pNode != NULL)
{
pHead = pHead->m_pNext;
delete pNode;
pNode = pHead;
}
}
void AddToTail(ListNode** pHead, int value)
{
ListNode* pNew = new ListNode();
pNew->m_nValue = value;
pNew->m_pNext = NULL;
if (*pHead == NULL)
{
*pHead = pNew;
}
else
{
ListNode* pNode = *pHead;
while (pNode->m_pNext != NULL)
pNode = pNode->m_pNext;
pNode->m_pNext = pNew;
}
}
void RemoveNode(ListNode** pHead, int value)
{
if (pHead == NULL || *pHead == NULL)
return;
ListNode* pToBeDeleted = NULL;
if ((*pHead)->m_nValue == value)
{
pToBeDeleted = *pHead;
*pHead = (*pHead)->m_pNext;
}
else
{
ListNode* pNode = *pHead;
while (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)
pNode = pNode->m_pNext;
if (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue == value)
{
pToBeDeleted = pNode->m_pNext;
pNode->m_pNext = pNode->m_pNext->m_pNext;
}
}
if (pToBeDeleted != NULL)
{
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}
void deleteDups1(ListNode* p){
if (p == NULL)
return;
hash_map<int, bool> mymap;
ListNode* pPre = NULL;
while (p != NULL){
hash_map<int, bool>::iterator it = mymap.find(p->m_nValue);
if (it == mymap.end()){
mymap[p->m_nValue] = true;
pPre = p;
p = p->m_pNext;
}
else{
pPre->m_pNext = p->m_pNext;
delete p;
p = pPre->m_pNext;
}
}
}
void deleteDups2(ListNode* p){
if (p == NULL)
return;
ListNode* current = p;
while (current != NULL){
ListNode* runner = current;
while (runner->m_pNext != NULL){
if (runner->m_pNext->m_nValue == current->m_nValue)
runner->m_pNext = runner->m_pNext->m_pNext;
else
runner = runner->m_pNext;
}
current = current->m_pNext;
}
}
int main(){
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3_ = CreateListNode(3);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode4_ = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);
ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3_);
ConnectListNodes(pNode3_, pNode3);
ConnectListNodes(pNode3, pNode4);
ConnectListNodes(pNode4, pNode4_);
ConnectListNodes(pNode4_, pNode5);
PrintList(pNode1);
cout << endl;
deleteDups1(pNode1);
PrintList(pNode1);
cin.get();
DestroyList(pNode1);
return 0;
}
其中deleteDups1是用hash表实现的,时间复杂度为O(N),deleteDups2为不借助hash实现的,空间复杂度为O(1),时间复杂度为O(N^2)。