算法简介,练习10.2-4

时间:2013-07-28 07:41:27

标签: algorithm

这是运行算法简介的问题,第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转换为其他表达式(例如列表中元素的数量),但我认为这不是解决方案。

我在解决这个问题时缺乏什么?

3 个答案:

答案 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;