我實現了我的linkedList函數,它在最後插入,但我使用了蠻力方法,直到結束,然後添加它。我想將其改爲O(1)。如果你們有任何提示會很棒。如何更改我的鏈接列表插入功能從O(N)到O(1)
0
A
回答
6
做出這個O(1)的唯一方法是保持對List
對象中最後一個Object
的引用。無論何時在List
的末尾插入新對象,指針都會更新爲指向它。
2
您的實際問題已經得到解答:存儲一個額外的尾指針,您可以在其中插入而不循環遍歷整個列表。
但也看看你的代碼:
for (node; node->getNext() != NULL && node->getNext()->getElement() != data;)
node= node->getNext();
node->setNext(insertNode);
在第二個條件的for循環看起來有點怪我。如果你想追加一個元素==數據的新元素,你的循環將停止在任何具有該值的現有元素上,並且你會在它之前附加新分配的元素,並且丟失所有以現有元素開始的舊元素元素==數據的節點。看起來像一個bug走向我。
1
正如其他人所說,你需要一個tail
節點添加到列表中,然後你可以使用這個insertAtEnd()
實施:
template <class Object>
void List<Object>::insertAtEnd(const Object& o)
{
ListNode<Object>* insertNode = new ListNode<Object>(o, nullptr);
if (!head) head = insertNode;
if (tail) tail->setNext(insertNode);
tail = insertNode;
}
相關問題
- 1. 不應插入O(n)而不是O(1)或O(n)插入未排序的鏈表中?
- 2. 爲什麼從O(1)調度程序到O(log N)的CFS?
- 3. 我怎樣才能找到與時間O(n)和空間O(1)
- 4. 在JavaScript中將O(n^3)更改爲O(n^2)
- 5. 爲什麼鏈表刪除和插入操作的複雜度爲O(1)?它不應該是O(n)
- 6. 用O搜索鏈表(1)
- 7. 如何將這些自定義對象列表的時間複雜度從O(n)減少到O(1)?
- 8. O(N)查找,但O(日誌(N))的比較排序列表
- 9. 找到O(1)的空間和O(n)的時間
- 10. 哪一個更好? O(n^1/2)或O(logn)
- 11. 我應該考慮memmove()O(n)還是O(1)?
- 12. 證明最大(O(f(n)),O(g(n)))= O(max(f(n),g(n))
- 13. 大O符號 - O(n日誌(N))對O(的log(n^2))
- 14. O(m + n)或O(mlgn)更好
- 15. 我怎樣才能使O(N)而不是O(N^2)的性能?
- 16. 鄰接矩陣列表O(m + n)上的BFS如何?
- 17. 在漸近分析中,證明:O表示大O. O(f(n)+ g(n))= O(max {f(n),g(n)})
- 18. 鏈接列表和文件I/O
- 19. O(n)???誰能告訴我的.reverse
- 20. 時間複雜度 - O(n^2)到O(n log n)搜索
- 21. O(nlog * n)和O(n)之間?
- 22. 是C++語句的大-O'delete [] Q;' O(1)或O(n)?
- 23. 對於數組,PHP的count()函數是O(1)還是O(n)?
- 24. 堆性能低下。 O(n)而不是\t O(日誌n)
- 25. 哪裏可以找到O(n^2)和O(n)等的含義?
- 26. 如何從其節點列表中更快地更新樹,然後O(n^2)?
- 27. 如何計算O(Log(N))?
- 28. 代碼O(nlog(n))的T(n)如何?
- 29. 如何僅使用O(1)空間在鏈接列表上實現MergeSort?
- 30. Deque random cces O(n)in python while O(1)in C++,why?
你可以添加一個名爲'tail'一個成員變量,你會需要照顧你的其他功能。 – scohe001
是的,基本上存儲一個指向列表末尾的指針並將其用於插入。按照慣例,刪除和添加將需要跟蹤此。 –
不要忘記,當調用insertAtEnd()時,如果列表爲空,那麼'tail'將爲空。 –