Re: [问题] linked list插入的复杂度

楼主: schizophrena (你很記者你很腦殘)   2016-07-27 21:41:45
我想问一下
答案是A 我也知道为什么
为何 listNode不设计成
struct listNode
{
struct listNode* prevPtr;
struct listNode* nextPtr;
}
这样当最后一个是 L , 然后要delete L就是
listNode* L = getLastNode(); // L是现在最后一个node
new_L = L->prevPtr; // 将现在的倒数第二个node指定成new_L
delete L; // delete L
L = new_L; // 将 L 指定成倒数第二个node
这样的作法应该A所要作的时间复杂度就不会等比于list的长度了吧?
是这种作法不好? 还是? 有什么原因吗?
※ 引述《einna (Annie)》之铭言:
: http://i.imgur.com/30Wsgfu.png
: 想请问一下为什么答案是C呀?
: 以下的code的概念应该可以实现C的动作,但不需要跑遍整个linked list。
: struct listNode {
: char data;
: struct listNode *nextPtr;
: };
: typedef struct listNode *ListNodePtr;
: void insert(listNode F, listNode L, listNode new_point, int new_value)
: {
: new_point->data = new_value; //指定值给main alloc好,传进来的新指标
: L->nextPtr = new_point; //利用L去把这个新指标加到串行后面。
: L = L->nextPtr; //更新L的位置。
: }
: 还是我有什么地方没有考虑到,希望网友可以告诉我盲点。
作者: LPH66 (-6.2598534e+18f)   2016-07-27 21:43:00
你这个叫做双向链结串行, 好处当然就是你说的往前走是常数但相对的在插入时就要维护两个指标而不是一个以及因为存两个指标, 空间用量也比较多实际上要用单向或双向是看使用情形决定顺带一提, C++ STL 里单双向的都有单向的是 std::forward_list, 双向的是 std::list
作者: Caesar08 (Caesar)   2016-07-27 21:49:00
楼上已经帮你解答完毕。补充C++11才有std::forward_list
楼主: schizophrena (你很記者你很腦殘)   2016-07-27 22:50:00
谢谢解答
作者: joeywayi (拉拉拉吃屎啦)   2016-07-28 03:20:00
因为浪费空间?
作者: steve1012 (steve)   2016-07-28 08:39:00
看需求吧 有时需要啊
作者: chchwy (mat)   2016-07-28 11:49:00
如果你有十万个node 那浪费的空间就很可观了
楼主: schizophrena (你很記者你很腦殘)   2016-07-28 12:04:00
但是如果十万个node要找到最后的那个再删除时间也很可观耶 @_@
作者: longlongint (华哥尔)   2016-07-28 15:32:00
如果是 stack queue 就不需要删除最后一个node 了从 head tail 插入, 从 head 删除
作者: steve1012 (steve)   2016-07-29 03:40:00
所以就说看需求啊 各有好处 没有完美的ds空间 时间 本身结构复杂难implement 都是考量的选项
作者: kwpn (ITSST)   2016-07-30 13:10:00
看需求拉,若平台就没这么多空间给你,就考虑用时间换

Links booklink

Contact Us: admin [ a t ] ucptt.com