日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

删除链表中的重复项

發(fā)布時間:2023/11/27 生活经验 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 删除链表中的重复项 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
方法一:時間優(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ù)值比較;

建立指針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é)

以上是生活随笔為你收集整理的删除链表中的重复项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。