您的位置:首页 > 职场人生

临阵磨枪 之 四道有趣的单链表面试题

2009-10-05 20:38 218 查看
链表也算是基本数据类型之一了。记得刚学习C语言的时候,链表和数组是见得最多的数据类型了。也正因为它的常用,在面试的时候自然会有所涉及,本文主要讨论四道我觉得比较有趣的关于单链表的面试题。
Q1 链表的反序

Q2 找出链表的中间元素

Q3 链表排序

Q4 判断一个单链表是否有环

以下给出链表结点的数据结构:

typedef struct _list_node
{
double keyVal;
struct _list_node *next;
}ListNode;

Q1 单链表的反序

int is_looplist (ListNode *head)
{
ListNode *p1, *p2;
p1 = p2 = head;

if (head == NULL || head->next == NULL)
{
return 0;
}

while (p2->next != NULL && p2->next->next != NULL)
{
p1 = p1->next;
p2 = p2->next->next;
if (p1 == p2)
{
return 1;
}
}

return 0;

}

思路分析:

这道题是《C专家编程》中的题了。其实算法也有很多,比如说:我觉得进行对访问过的结点进行标记这个想法也不错,而且在树遍历等场合我们也经常使用。但是在不允许做标记的场合就无法使用了。在种种限制的条件下,就有了上面的这种算法,其实思想很简单:就像两个人在操场上跑步一样,只要有个人的速度比另一个人的速度快一点,他们肯定会有相遇的时候的。不过带环链表与操场又不一样,带环链表的状态是离散的,所以选择走得快的要比走得慢的快多少很重要。比如说这里,如果一个指针一次走三步,一个指针一次走一步的话,很有可能它们虽然在一个环中但是永远遇不到,这要取决于环的大小以及两个指针初始位置相差多少了。呵呵。你能看出两个指针的速度应该满足什么关系才能在有环的情况下相遇吗?如果你知道,不妨跟我讨论一下,呵呵。

参考资料

1. 欧立奇等著《程序员面试宝典》,电子工业出版社

2. 《C专家编程》

3.Jurgen Appelo 《软件开发者面试百问》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐