zoukankan      html  css  js  c++  java
  • 智能指针版本链表

    class Node;
    using NodePtr = std::unique_ptr<Node>;
    class Node
    {
    public:
        int     value;
        NodePtr next = nullptr;
        explicit Node(int value_ = 0): value(value_){}
    };
    
    NodePtr create(const std::vector<int>& data)
    {
        if (data.empty ()){
            return nullptr;
        }
        auto head(std::make_unique<Node>(data.front ()));
        auto tail = head.get();
        std::for_each(data.cbegin () + 1, data.cend (),
                      [&](int value)
        {
           tail->next = std::make_unique<Node>(value);
           tail = tail->next.get();
        });
        return std::move(head);
    }
    
    void print(const NodePtr& head)
    {
        auto it = head.get ();
        while(it){
            std::printf("%d ", it->value);
            it = it->next.get();
        }
    }
    
    NodePtr reverse(NodePtr& old_head)
    {
        NodePtr new_head = nullptr;
        while(old_head){
            auto next = std::move(old_head->next);
            old_head->next = std::move(new_head);
            new_head = std::move(old_head);
            old_head = std::move(next);
        }
        return std::move(new_head);
    }
    
    void sortedInsert(NodePtr* head_ref, NodePtr&& node)
    {
        auto current_ref = head_ref;
        while (((*current_ref) != nullptr) &&
               ((*current_ref)->value < node->value)){
            current_ref = &((*current_ref)->next);
        }
        node->next = std::move(*current_ref);
        (*current_ref) = std::move(node);
    }
    
    void insertSort(NodePtr* head_ref)
    {
        NodePtr new_head = nullptr;
        for (NodePtr it = std::move(*head_ref), next; it; it = std::move(next)){
             next = std::move(it->next);
             sortedInsert (&new_head, std::move(it));
        }
        *head_ref = std::move(new_head);
    }
    
    NodePtr removeDuplicates(NodePtr& head)
    {
        if(head == nullptr){
            return std::move(head);
        }
        for(auto it = head.get (); it->next;){
            if(it->value == it->next->value){
                auto next = std::move(it->next->next);
                it->next = std::move(next);
            }else{
                it = it->next.get();
            }
        }
        return std::move(head);
    }
    
    NodePtr merge(NodePtr& node1, NodePtr& node2)
    {
        if (node1 == nullptr){
            return std::move(node2);
        }
        if (node2 == nullptr){
            return std::move(node1);
        }
        NodePtr *merged_node = nullptr;
        if (node1->value < node2->value){
            merged_node = &node1;
            (*merged_node)->next = merge (node1->next, node2);
        }else{
            merged_node = &node2;
            (*merged_node)->next = merge (node1, node2->next);
        }
        return std::move(*merged_node);
    }
  • 相关阅读:
    在SharePoint中实现Workflow(2):创建一个Workflow
    pku1384PiggyBank(动态规划)
    pku1088滑雪(记忆性搜索)
    hdu1251统计难题(初次接触字典树)
    详细解说 STL 排序(Sort)
    pku1631Bridging signals(动态规划题+二分搜索)
    pku1157LITTLE SHOP OF FLOWERS(简单动态规划题:摆放鲜花使审美价值达到最高)
    pku1067取石子游戏(博弈)
    pku2524Ubiquitous Religions(初次接触并查集)
    pku1050To the Max(求矩阵的最大子段和)
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/5187652.html
Copyright © 2011-2022 走看看