[英]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.