[原创] 编写函数,实现对链表元素的排序与分类

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实现

我用java刷 leetcode 147. 对链表进行插入排序

如何使用优先队列对链表进行排序

147. 对链表进行插入排序

对链表进行插入排序