簡體   English   中英

C++共享指針鏈表

[英]c++ shared pointer linked list

從數組中創建鏈表的正確方法是什么類型聲明如下

template<typename T>

struct ListNode {
public:
    T data;
    shared_ptr<ListNode<T>> next;

    ListNode() { }

    ListNode(T data, shared_ptr<ListNode<T>> next) {
        this->data = data;
        this->next = next;
    }
};

數組結構如下 [value1, index1, value2, index2, ... , valueN] 在偶數位置是值,接下來是數組中下一個值的相對索引

例如:[1,1,2,2,3,1]

應該創建以下鏈接列表: node(val=1,idx=0) -> node(val=2,idx=1) -> node(val=3,idx=2) -> node(val=2,idx= 1) -> ...

我目前的錯誤實現如下:

shared_ptr<ListNode<int>> convert(vector<int> value) {
   vector<shared_ptr<ListNode<int>>> nodes;
   for (int i = 0; i < value.size(); i += 2) {
      shared_ptr<ListNode<int>> node = make_shared<ListNode<int>>();
      node->data = value[i];
      nodes.push_back(node);
   }
   for (int i = 1; i < value.size(); i += 2) {
      shared_ptr<ListNode<int>> node = nodes[floor((i - 1) / 2)];
      int nextIndex = value[i];
      if (nextIndex >= 0) {
         shared_ptr<ListNode<int>> nextNode = nodes[nextIndex];
         node->next = nextNode;
      }
   }
   return nodes.empty() ? nullptr : nodes[0];
}

從這個函數返回后,我遇到了內存問題。 任何代碼或鏈接將不勝感激。 謝謝。

首先,嘗試make_shared<ListNode<int>>()而不是make_unique<ListNode<int>>()因為您在其他任何地方都使用shared_ptr

這里的技巧是保持一個指向列表最后一個元素的指針,並在循環的每次迭代中遞增它。

shared_ptr<ListNode<int>> convert(vector<int> values) {
   shared_ptr<ListNode<int>> head;
   if(values.size() == 0) return head;
   
   head = shared_ptr<ListNode<int>>(new ListNode<int>());
   
   ListNode<int> *node = head.get();
   node->data = values[0];
   
   for (int i = 1; i < values.size(); i++) {
       node->next = shared_ptr<ListNode<int>>(new ListNode<int>());
       node->next->data = values[i];
       node = node->next.get();
   }
   
   return head;
}

int main() {
    vector<int> vec = {1, 2, 3, 4};
    shared_ptr<ListNode<int>> list = convert(vec);
    cout
        <<list->data<<" "
        <<list->next->data<<" "
        <<list->next->next->data<<" "
        <<list->next->next->next->data<<endl;
        
    return 0;
}

輸出: 1 2 3 4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM