[原创] 编写函数,实现对链表元素的排序与分类
Posted qmzp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[原创] 编写函数,实现对链表元素的排序与分类相关的知识,希望对你有一定的参考价值。
要求:存在很多元素,如<A,B>,<a,b>,<b,d>,<B, E>, <#,1>, <1, 8>,将这些元素进行分类并排序,
使之输出结果为:
<A,B> -- <B,E>;
<a,b> -- <b,d> ;
<#,1> -- <1,8>;
函数原型:list<listNode> listElementSort ( listNode * listnode);
输入:listnode是list类型,其内部各元素为Node类型;
node定义如下:
typedef pair<string,string> Node;
typedef list<pair<string, string> > listNode;
输出:list<listNode>元素
源码实现:
#include <map> #include <list> #include <iostream> using namespace std; typedef pair<string, string> Node; typedef list<pair<string, string> > listNode; list<listNode> listElementSort(listNode *listnode) { map<string, listNode> mapBySTART; map<string, listNode> mapByEND; while((*listnode).size()>0){ Node node = (*listnode).front(); if(mapByEND.count(node.first)==0 && mapBySTART.count(node.second)==0){ listNode lst; lst.push_back(node); mapBySTART.insert(pair<string, listNode> (node.first, lst)); mapByEND.insert(pair<string, listNode> (node.second, lst)); } if(mapByEND.count(node.first)==0 && mapBySTART.count(node.second)==1){ listNode mapStart_listNode_only = mapBySTART.find(node.second)->second; mapStart_listNode_only.push_front(node); mapBySTART.erase(node.second); mapBySTART.insert(pair<string, listNode> (node.first, mapStart_listNode_only)); ///modify mapByEnd Node mapStart_endNode = mapStart_listNode_only.back(); mapByEND[mapStart_endNode.second] = mapStart_listNode_only; } if(mapByEND.count(node.first)==1 && mapBySTART.count(node.second)==0){ listNode mapEnd_listNode_only = mapByEND.find(node.first)->second; mapEnd_listNode_only.push_back(node); mapByEND.erase(node.first); mapByEND.insert(pair<string, listNode> (node.second, mapEnd_listNode_only)); ///modify mapByStart Node mapEnd_startNode = mapEnd_listNode_only.front(); mapBySTART[mapEnd_startNode.first] = mapEnd_listNode_only; } if(mapByEND.count(node.first)==1 && mapBySTART.count(node.second)==1){ listNode mapEnd_listNode_both = mapByEND.find(node.first)->second; listNode mapStart_listNode_both = mapBySTART.find(node.second)->second; Node mapEnd_startNode_both_interval = mapEnd_listNode_both.front(); Node mapStart_endNode_both_interval = mapStart_listNode_both.back(); mapEnd_listNode_both.push_back(node); for(listNode::iterator it=mapStart_listNode_both.begin(); it!=mapStart_listNode_both.end(); it++){ mapEnd_listNode_both.push_back(*it); } mapByEND[mapStart_endNode_both_interval.second] = mapEnd_listNode_both; mapBySTART[mapEnd_startNode_both_interval.first]= mapEnd_listNode_both; mapByEND.erase(node.first); mapBySTART.erase(node.second); } (*listnode).pop_front(); } ///遍历map,获取返回值。 list<listNode> listlistnode; for(map<string, listNode>::iterator it = mapByEND.begin(); it!=mapByEND.end();it++){ listlistnode.push_back(it->second); } return listlistnode; } int main() { listNode list1; list1.push_back(Node("aa", "ab")); list1.push_back(Node("ba", "bb")); list1.push_back(Node("cc", "cd")); list1.push_back(Node("bc", "bd")); //list1.push_back(Node("ab", "ac")); list1.push_back(Node("cb", "cc")); list1.push_back(Node("bb", "bc")); list1.push_back(Node("ca", "cb")); list1.push_back(Node("ac", "ad")); for(listNode::iterator it=list1.begin(); it!=list1.end();it++){ cout << it->first << " " << it->second << endl; } cout << "result:" <<endl; list<listNode> listlistnode = listElementSort(&list1); for(list<listNode>::iterator iter=listlistnode.begin(); iter != listlistnode.end(); iter++){ listNode listnode = *iter; for(listNode::iterator it=listnode.begin(); it!=listnode.end(); it++){ cout << it->first << " " << it->second << " "; } cout << endl; } return 0; }
以上是关于[原创] 编写函数,实现对链表元素的排序与分类的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode第147题—对链表进行插入排序—Python实现
LeetCode第147题—对链表进行插入排序—Python实现