删除链表中的重复项
方法一:時間優(yōu)先
建立一個hash_set,key為鏈表中已經(jīng)遍歷的節(jié)點內(nèi)容,開始時為空。
從頭開始遍歷鏈表中的節(jié)點:
- 如果節(jié)點內(nèi)容已經(jīng)在hash_set中存在,則刪除此節(jié)點,繼續(xù)向后遍歷;
- 如果節(jié)點內(nèi)容不在hash_set中,則保留此節(jié)點,將節(jié)點內(nèi)容添加到hash_set中,繼續(xù)向后遍歷。
這里STL沒有hash_set,我直接用set實現(xiàn)的:
方法二:空間優(yōu)先
解決的思路如下:
建立指針p,用于遍歷鏈表;
建立指針q,q遍歷p后面的結(jié)點,并與p數(shù)值比較;
建立一個hash_set,key為鏈表中已經(jīng)遍歷的節(jié)點內(nèi)容,開始時為空。
從頭開始遍歷鏈表中的節(jié)點:
- 如果節(jié)點內(nèi)容已經(jīng)在hash_set中存在,則刪除此節(jié)點,繼續(xù)向后遍歷;
- 如果節(jié)點內(nèi)容不在hash_set中,則保留此節(jié)點,將節(jié)點內(nèi)容添加到hash_set中,繼續(xù)向后遍歷。
這里STL沒有hash_set,我直接用set實現(xiàn)的:
方法二:空間優(yōu)先
解決的思路如下:
建立指針p,用于遍歷鏈表;
建立指針q,q遍歷p后面的結(jié)點,并與p數(shù)值比較;
建立指針r,r保存需要刪掉的結(jié)點,再把需要刪掉的結(jié)點的前后結(jié)點相接。由此去掉重復(fù)值。
下面是相關(guān)代碼:
#include "list.h"
#include <set>
using namespace std;//借助STL中的set來刪除鏈表中的重復(fù)項,比較高效(時間比中間更重要)
//建立STL中的set,key為鏈表中已經(jīng)遍歷的結(jié)點內(nèi)容,開始時為空
//從頭開始遍歷鏈表中的結(jié)點:
//如果結(jié)點內(nèi)容已經(jīng)在set中存在,則刪除此結(jié)點,繼續(xù)向后遍歷
//如果結(jié)點內(nèi)容不在set中,則保留此結(jié)點,將結(jié)點內(nèi)容添加到set中,繼續(xù)向后遍歷
ListNode* del_repeated_nodes(ListNode* pHead){if(pHead == NULL)return pHead;set<int> KeySet;ListNode* pNewHead = pHead;ListNode* pCurNode = pHead;KeySet.insert(pHead->value);while(pCurNode->next){//已經(jīng)存在則刪除if(KeySet.count(pCurNode->next->value)){ListNode* pDelNode = pCurNode->next;pCurNode->next = pCurNode->next->next;delete pDelNode;}else{ //不存在則新增KeySet.insert(pCurNode->next->value);pCurNode = pCurNode->next;}}return pNewHead;
}//使用循環(huán)遍歷方法:
//1.建立指針pNode,用于遍歷鏈表
//2.建立指針pIterNode,用于遍歷pNode之后的結(jié)點,并與pNode的值比較
//3.建立指針pDupNode,保存需要刪除的結(jié)點,再把需要刪除的結(jié)點的前后結(jié)點相接,由此去掉重復(fù)值
ListNode* del_duplicate_nodes(ListNode* pHead){ListNode* pNewHead = pHead;ListNode* pNode = pNewHead;while(pNode){//pNode用于遍歷鏈表ListNode* pIterNode = pNode;while(pIterNode->next){//遍歷pNode之后的結(jié)點,并與pIterNode的值比較if(pIterNode->next->value == pNode->value){ListNode* pDupNode = pIterNode->next;//保存要刪除的值pIterNode->next = pIterNode->next->next;delete pDupNode;}elsepIterNode = pIterNode->next;}pNode = pNode->next;}return pNewHead;
}ListNode* Test(ListNode* pHead){printf("The original list is: \n");PrintList(pHead);//這里采用兩種方法:前者空間占優(yōu),后者時間占優(yōu)//ListNode* pNewHead = del_duplicate_nodes(pHead);ListNode* pNewHead = del_repeated_nodes(pHead);printf("The del duplicate list is: \n");PrintList(pNewHead);return pNewHead;
}void Test1(){ListNode* pNode1 = CreateListNode(1);ListNode* pNode2 = CreateListNode(1);ListNode* pNode3 = CreateListNode(2);ListNode* pNode4 = CreateListNode(2);ListNode* pNode5 = CreateListNode(4);ListNode* pNode6 = CreateListNode(1);ConnectListNode(pNode1,pNode2);ConnectListNode(pNode2,pNode3);ConnectListNode(pNode3,pNode4);ConnectListNode(pNode4,pNode5);ConnectListNode(pNode5,pNode6);ListNode* pReverseHead = Test(pNode1);DestroyList(pReverseHead);
}void Test2(){ListNode* pNode1 = CreateListNode(1);ListNode* pReverseHead = Test(pNode1);DestroyList(pReverseHead);
}void Test3(){Test(NULL);
}int main(int argc, char** argv){Test1();Test2();Test3();return 0;
}
總結(jié)
- 上一篇: [综合面试] 计算机面试书籍与求职网站推
- 下一篇: 交互两个数(不引入第三个变量)