编程之美3.11扩展问题

首先,对于文章中给出的bisearch()程序有一点疑问,对于strcmp()函数调用的字符指针都不判断是否为空。显然,这个保证留给了该函数的调用者,本身也没什么问题。但是,我觉得在实际代码中,起码应该使用assert()来测试一下为好。但是考虑到字符指针数组其实在运行时可能经常变化,其实风险还是有的。其实这样的东西严格来讲的确不能算错误,但是却是真真正正的风险。

 

好了,言归正传。

 

1)判断一个单链表是否有环。如果有,把指向环开始的指针返回;如果没有,返回NULL。

LinkedList* IsCyclicLinkedList (LinkedList* pHead)

{

    LinkedList *pCur;

    LinkedList *pStart;

    while (pCur != NULL)

    {

         for (;;)

         {

             if (pStart == pCur -> pNext)

                 return pStart;

             pStart = pStart->pNext;

         }

         pCur = pCur->pNext;

    }

}

 

我觉得这个程序挺麻烦的。按照这个程序的思路,最终可能陷入到那个环中无法脱身,而且没有办法探测出已经陷入环中了。我改的程序如下:

LinkedList* IsCyclicLinkedList(LinkedList* pHead)

{

    if (pHead == NULL)

        return NULL;

 

    LinkedList *pStart = pHead->pNext;

    vector<LinkedList*> v;

    v.push_back(pHead);

 

    for (; pStart != NULL; ) {

         for (int i=0; i<v.size(); i++) {

             if (pStart == v[i])

                 return pStart;

         }

 

         pStart = pStart->pNext

    }

 

    return NULL;

}

 

这个应该不是作者的原意吧?不知道大家有没有什么思路可以提供给我。实在想不出好的方法。以前听说过快慢指针的方法检测环,但是好像用在这里也没有特别好的思路。

 

另外,扩展问题上的几个小问题:

给定一个有序(不降序)数组arr,求任意一个i使得arr[i]等于v,不存在则返回-1:

就用书上代码就可以了:

int bisearch(char** arr, int b, int e, char* v) { int minIndex = b, maxIndex = e, midIndex; while (minIndex < maxIndex – 1) { midIndex = minIndex + (maxIndex – minIndex) / 2; if (strcmp(arr[midIndex], v) <= 0) { minIndex = midIndex; } else { maxIndex = midIndex; } } if (!strcmp(arr[maxIndex], v)) { return maxIndex; } else if (!strcmp(arr[minIndex], v)) { return minIndex; } else { return -1; } }  

 

给定一个有序(不降序)数组arr,求最小的i使得arr[i]等于v,不存在则返回-1:

int bisearch(char** arr, int b, int e, char* v) { int minIndex = b, maxIndex = e, midIndex; while (minIndex < maxIndex – 1) { midIndex = minIndex + (maxIndex – minIndex) / 2; if (strcmp(arr[midIndex], v) < 0) { minIndex = midIndex; } else { maxIndex = midIndex; } } if (!strcmp(arr[minIndex], v)) { return minIndex; } else if (!strcmp(arr[maxIndex], v)) { return maxIndex; } else { return -1; } }

 

给定一个有序(不降序)数组arr,求最大的i使得arr[i]等于v,不存在则返回-1:

 int bisearch(char** arr, int b, int e, char* v) { int minIndex = b, maxIndex = e, midIndex; while (minIndex < maxIndex – 1) { midIndex = minIndex + (maxIndex – minIndex) / 2; if (strcmp(arr[midIndex], v) <= 0) { minIndex = midIndex; } else { maxIndex = midIndex; } } if (!strcmp(arr[maxIndex], v)) { return maxIndex; } else if (!strcmp(arr[minIndex], v)) { return minIndex; } else { return -1; } }

 

给定一个有序(不降序)数组arr,求最大的i使得arr[i]小于v,不存在则返回-1:

int bisearch(char** arr, int b, int e, char* v) { int minIndex = b, maxIndex = e, midIndex; while (minIndex < maxIndex – 1) { midIndex = minIndex + (maxIndex – minIndex) / 2; if (strcmp(arr[midIndex], v) < 0) { minIndex = midIndex; } else { maxIndex = midIndex; } } if (strcmp(arr[maxIndex], v) < 0) { return maxIndex; } else if (strcmp(arr[minIndex], v) < 0) { return minIndex; } else { return -1; } }

 

给定一个有序(不降序)数组arr,求最小的i使得arr[i]大于v,不存在则返回-1:

int bisearch(char** arr, int b, int e, char* v) { int minIndex = b, maxIndex = e, midIndex; while (minIndex < maxIndex – 1) { midIndex = minIndex + (maxIndex – minIndex) / 2; if (strcmp(arr[midIndex], v) <= 0) { minIndex = midIndex; } else { maxIndex = midIndex; } } if (strcmp(arr[minIndex], v) > 0) { return minIndex; } else if (strcmp(arr[maxIndex], v) > 0) { return maxIndex; } else { return -1; } }

 

感觉写得不是特别好。以后有了什么新的领悟再来改进吧。

    原文作者:houxiangxiang
    原文地址: https://blog.csdn.net/houhouzhe/article/details/6546566
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞