这是运行算法简介的问题,第3版: (我知道这是一个微不足道的问题,但我无法理解这一点。)
第10章,第240页:
10.2-4
如上所述,LIST-SEARCH过程中的每个循环迭代都需要 两个测试:一个用于
x != L.nil
,另一个用于x.key != k
。演示如何 在每次迭代中消除x != L.nil
的测试。
LIST-SEARCH(L, k)
x = L.nil.next
while x != L.nil and x.key != k
x = x.next
return x
L
是带有哨兵的循环,双重链接列表。 (sentinel是起始中的固定静态元素,有助于简化边界条件。例如,假设我们提供了列表L
一个对象L.nil
,它代表NIL
但是全部列表中其他对象的属性。)
除非您搜索的k
始终存在,否则简单删除x != L.nil
会导致无限次迭代。
您可以将此表达式x != L.nil
转换为其他表达式(例如列表中元素的数量),但我认为这不是解决方案。
我在解决这个问题时缺乏什么?
答案 0 :(得分:13)
诀窍是在进入循环之前将你的标记键设置为值k
。这样,您可以消除nil
检查并仍然确保循环终止。找到k
后,找到的节点要么是sentinel,要么是您要查找的值。
答案 1 :(得分:11)
前置哨兵。使用哨兵,x.key == k
条件无论如何都会遇到。确保删除哨兵。
LIST-SEARCH(L, k)
LIST-INSERT(L, k)
x = L.head.next
while x.key != k
x = x.next
if x == L.head
ret = NIL
else
ret = x
LIST-DELETE(L, L.head)
return ret
答案 2 :(得分:1)
做这样的事情:
LIST-SEARCH(L,k)
nil.key = k;
currentPtr = nil.next;
while(currentPtr.key != k)
currentPtr = currentPtr.next;
nil.data = -1; // dummy key
return currentPtr;