和面试官对两道数据结构算法题持不同意见,望各位前辈给予指教,在此多谢各位了

whywherewhen 2010-08-14 03:57:36
今天去面试,和面试官对两道数据结构算法题持不同意见,望各位前辈给予指教,在此多谢各位了!

题目:反转单链表
我的答案:
Public void ReversLinkList(LinkList H)
{
Node p=H.Next;
Node q= new Node;
H.Next= null;

While(p!= null)
{
q=p;
p=p.Next;
q.Next=H.Next;
H.Next=q;
}
}

面试官估计是没看懂,或者认为我写的不对,说给我提示去想循环和想交换两个结点。。我当时就被弄晕了,然后也不知道他是怎么想的。。。试图去理解,还是没弄明白,他好像要给我一些提示,让我顺着他的想法去给一个方法,但是我又觉得我的方法是对的。

然后我就努力去想我的,但是因为受他的几次干扰我思路也被打断了,最后终于给他讲明白了,没想到他说我的方法不好,很复杂,然后他又说了他的方法:

面试官的方法:
从链表的开始循环到结束,然后从最后一个结点开始往前依次交换结点。

我想了想没有想出面试官的方法为什么比我的好:(

面试结果这道题写的是 我的方法很笨。。。。
请问各位大侠,我的方法真的很笨吗?

然后还有一道:
求两个单链表是否有相同结点?如果有相同结点,返回第一个结点

为了方便只写思路吧。
我的思路:
1. 遍历两个链表,如果最后的结点相同则有相同结点,否则没有。
2. 比较两个链表的长度M和N(此处假设M>N),然后对于较长的那个链表,指针次后移直到 M-N 的位置(因为多出来的结点肯定不是相同结点),然后再去循环比较。

面试官说前部分对了,后半部分不对,因为我们并不知道哪一个是相同的结点,所以我从前往后找并不知道哪个在相同结点之前的结点多,所以要从后往前找。

当时被他给说晕了,所以说哦,是这样。

可是回来以后我还是觉得我的没错,因为自从相同结点到链表的最后一个结点,对于两个链表来讲结点个数是一样的,所以链表长的那个肯定是在相同结点之前结点比较多的那个。并不存在面试官所说的问题

面试结果是:
前半部分正确,后半部分只能在引导下才能领悟。

看了这两个面试结果我觉得很迷惑,请各位前辈指点迷津,多谢了!



...全文
231 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dolphin_001 2010-08-16
还要看看是否是循环链表。
如果有2个都是,分别记下这两个循环链表上的一个节点(不同步长相遇时的那个)。在其中的一个链表上,指针走一圈,若还没经过另外一个链表的已知节点,说明不相交,经过说明相交;
如果一个是,一个不是,说明不相交。
如果都不是,用lz的方法就可以。
回复
fire_woods 2010-08-16
第一题反转的话, 题目没有说头指针H是否要被反转, 不过看函数的定义
Public void ReversLinkList(LinkList H)
头指针不要被反转.如果需要反转头指针, 函数至少应该定义成这样
Public void ReversLinkList(LinkList* pH)
Node q= new Node;改成Node q=null即可;


从楼主的描述来看,第二题所谓的相同应该是指节点的地址相同而不是节点的内容相同吧.
所以楼主的回答完全正确.
回复
Arucart 2010-08-16
楼主方法是不错
不过
Node q= new Node;

内存泄露?...
回复
丈八涯 2010-08-16
[Quote=引用 7 楼 g_idea 的回复:]
第一题没看到指针,不知道为什么
第二题如果有指针,那么就是从长链表中寻找是否有短链表表头地址吧。并且如何知道两个链表的长度的,如果不知道,就随便取一个链表了,如果取的是短的,则需要再取长的一次。加速的方法似乎还有很多。
[/Quote]
第二题我的回答是错误的,楼主的回答是正确的.不过不用循环比较了吧,直接一对一比较就行.
回复
Dolphin_001 2010-08-15
[Quote=引用 6 楼 litaoye 的回复:]

我倒认为链表为空的判断不是必需的,如果每一个封装的操作里面都要判断一下null,一次处理过程需要10几次类似的调用,不管是否为空,这个判断要执行10多次。这样还不如完全交给用户在外面判断,每一个子过程就不单独处理了。
[/Quote]
我倒觉得判断这块封转在模块内,这样用户调用就不用判断了。问题是现在很多库函数或类,内部是没这种判断的。
lz的思路挺好的。
回复
lzh_rong 2010-08-15
学习学习!
回复
丈八涯 2010-08-15
第一题没看到指针,不知道为什么
第二题如果有指针,那么就是从长链表中寻找是否有短链表表头地址吧。并且如何知道两个链表的长度的,如果不知道,就随便取一个链表了,如果取的是短的,则需要再取长的一次。加速的方法似乎还有很多。
回复
绿色夹克衫 2010-08-15
我倒认为链表为空的判断不是必需的,如果每一个封装的操作里面都要判断一下null,一次处理过程需要10几次类似的调用,不管是否为空,这个判断要执行10多次。这样还不如完全交给用户在外面判断,每一个子过程就不单独处理了。
回复
第一题:

lz代码本身也不对。
万一输入是空链表怎么办?
单链表反转一定要返回新的链表头,否则很可能丢失这个链表。
回复
whywherewhen 2010-08-14
[Quote=引用 4 楼 gogdizzy 的回复:]
第一题:

lz代码本身也不对。
万一输入是空链表怎么办?
单链表反转一定要返回新的链表头,否则很可能丢失这个链表。
[/Quote]

确实是没有写判断空链表的情况。。
回复
mengde007 2010-08-14

这样的面试官我也碰到过,他们根本不懂什么技术,纯粹对牛弹琴。
回复
acdbxzyw 2010-08-14
1、面试官说的不对吧。。。又不是双向链表,怎么能从后往前逆置。
2、两个链表没说是有序的?单链表两重循环从前往后,别从后往前了。。。
回复
acdbxzyw 2010-08-14
While(p!= null)
{
q=p;
p=p.Next;
q.Next=H.Next;
H = p; //应该有这句吧
H.Next=q;
}
}
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告