2014-10-21 7 views
5

मैं समस्या को हल करने के लिए ढेर का उपयोग करने की कोशिश कर रहा हूं "के सूचियों को विलय करें" जो कि क्रमबद्ध लिंक्ड सूचियों को विलय कर रहा है और इसे एक क्रमबद्ध सूची के रूप में वापस कर रहा है। आम तौर पर मैं सभी सूची नोड को स्टोर करने के लिए एक न्यूनतम ढेर बना देता हूं और तुलना के लिए पूर्वनिर्धारित कार्य LessThanLinkedList() का उपयोग करता हूं। लेकिन मुझे लाइन 62 और 75 में pop_heap() ऑपरेशन कभी नहीं मिला। यह ढेर के शीर्ष को नहीं हटाएगा, हालांकि मैंने पूर्वनिर्धारित तुलना फ़ंक्शन को पैरामीटर के रूप में उपयोग किया था। निम्नलिखित मेरा कोड है। मैं आईडीई के रूप में विजुअल स्टूडियो 2010 का उपयोग कर रहा हूं। किसी को कारण पता है? आपकी सहायता के लिए धन्यवाद!सी ++ एसटीएल pop_heap काम नहीं करता

#include <stdio.h> 
#include <stdlib.h> 
#include <vector> 
#include <queue> 
#include <list> 
#include <numeric> 

struct ListNode { 
    int val; 
    ListNode *next; 
    ListNode(int x) : val(x), next(NULL) {} 
}; 
using namespace std; 

class Solution { 
public: 

    static bool LessThanLinkedList(const ListNode * l1, const ListNode * l2) 
    { 
    return(l1->val > l2->val); 
    } 

    ListNode *mergeKLists(vector<ListNode *> &lists) { 

    int idx; 
    bool ball_list_null; 
    ListNode * pNode; 
    ListNode *new_head; 

    ball_list_null = true; 

    for(idx = 0; idx < lists.size(); idx++) 
    { 
     if(NULL != lists[idx]) 
     { 
      ball_list_null = false; 
      break; 
     } 
    } 
    if(true == ball_list_null) 
     return(NULL); 

    vector< ListNode* > list_heap; 
    for(idx = 0; idx < lists.size(); idx++) 
    { 
     if(NULL != lists[idx]) 
     { 
      pNode = lists[idx]; 
      while(NULL != pNode) 
      { 
       list_heap.push_back(pNode); 
       pNode = pNode->next; 
      } 
     } 
    } 

    make_heap(list_heap.begin(), list_heap.end(), LessThanLinkedList); 

    if(list_heap.size() > 0) 
    { 
     new_head = list_heap[0]; 
     pop_heap(list_heap.begin(), list_heap.end(), LessThanLinkedList);//not work 
    } 

    if(list_heap.size() == 0) 
    { 
     new_head->next = NULL; 
    } 
    else 
    { 
     pNode = new_head; 
     while(list_heap.size() >0) 
     { 
      pNode->next = list_heap[0]; 
      pop_heap(list_heap.begin(), list_heap.end(), LessThanLinkedList); // not work 
      pNode = pNode->next ; 
     } 
     pNode->next = NULL; 
    } 
    return(new_head); 

    } 
}; 

void main() 
{ 
    Solution xpfsln; 
    ListNode *l1,*l2,*l3,*l4,*l5,*l6,*l7,*head; 
    l1 = new ListNode(1); 
    l2 = new ListNode(2); 
    l3 = new ListNode(3); 

    l1->next = l2; 
    l2->next = l3; 
    l3->next = NULL; 

    vector<ListNode *> list_vec; 
    list_vec.push_back(l1); 

    head = xpfsln.mergeKLists(list_vec); 
} 

उत्तर

6

pop_heap कंटेनर से तत्वों को हटा नहीं देता है। ऐसा नहीं हो सकता है, क्योंकि इसमें कंटेनर तक पहुंच नहीं है, केवल इसके तत्व हैं। यह क्या करता है (यह मानते हुए कि [begin, end) एक मान्य, गैर-खाली ढेर बनाता है) तत्वों को पुनर्व्यवस्थित करते हैं जैसे ढेर का पहला तत्व सीमा का अंतिम तत्व होता है, और वैध ढेर के रूप में [begin, end-1) छोड़ देता है। यदि आप वास्तव में कंटेनर से तत्व को हटाना चाहते हैं, तो आपको pop_heap पर कॉल करने के बाद कंटेनर के अंतिम तत्व को मिटाना होगा (उदा। pop_back() पर कॉल के साथ)।

pop_heap(list_heap.begin(), list_heap.end(), LessThanLinkedList); 
list_heap.pop_back(); 
+0

धन्यवाद बहुत, बहुत मूल्यवान उत्तर। ऐसा लगता है कि यह मूल स्टैक पॉप फ़ंक्शन के समान नहीं है। मैं डिजाइन सुविधा को समझ सकता हूं, लेकिन कुछ असंगतता ला सकता हूं। – flashstar

संबंधित मुद्दे