j**l 发帖数: 2911 | 1 书中一个寻找链表倒数第m个元素的例子代码有误,这也恰恰是我们容易在书写白板代
码时候犯的错误,难免给面试官留下粗心的第一印象。
规定,如果m = 0, 则返回最后一个元素(下标从0开始,也可以定义m = 1返回最后一
个元素)
Element *findMToLastElement(Element *head, int m)
{
Element *current, *mBehind;
int i;
current = head;
for (i = 0; i < m; i++)
{
if (current->next)
current = current->next;
else
return NULL;
}
mBehind = head;
while (current->next)
{
current = current->next;
mBehind = mBehind->next;
}
retu |
v***u 发帖数: 40 | 2 thanks a lot for pointing out this. Good luck! |
I**A 发帖数: 2345 | 3 话说这个判断这么致命麽?
上次写一个find prime numbers between 2 and n
发给interviewer之后想起来,没有判断n是否大于1
后来也懒得再发email修改。。
【在 j**l 的大作中提到】 : 书中一个寻找链表倒数第m个元素的例子代码有误,这也恰恰是我们容易在书写白板代 : 码时候犯的错误,难免给面试官留下粗心的第一印象。 : 规定,如果m = 0, 则返回最后一个元素(下标从0开始,也可以定义m = 1返回最后一 : 个元素) : Element *findMToLastElement(Element *head, int m) : { : Element *current, *mBehind; : int i; : current = head; : for (i = 0; i < m; i++)
|
g**e 发帖数: 6127 | 4 尽量不要留下话柄给别人
【在 I**A 的大作中提到】 : 话说这个判断这么致命麽? : 上次写一个find prime numbers between 2 and n : 发给interviewer之后想起来,没有判断n是否大于1 : 后来也懒得再发email修改。。
|
v***u 发帖数: 40 | 5 我觉得这个部分有问题:
while (current)
{
current = current->next;
mBehind = mBehind->next;
}
你找的是m-1 to last不是m to last了,因为mBehind多移动了一个,如果这样写的话。
向大家求教,谢谢! |
t********1 发帖数: 799 | 6 mark
【在 j**l 的大作中提到】 : 书中一个寻找链表倒数第m个元素的例子代码有误,这也恰恰是我们容易在书写白板代 : 码时候犯的错误,难免给面试官留下粗心的第一印象。 : 规定,如果m = 0, 则返回最后一个元素(下标从0开始,也可以定义m = 1返回最后一 : 个元素) : Element *findMToLastElement(Element *head, int m) : { : Element *current, *mBehind; : int i; : current = head; : for (i = 0; i < m; i++)
|
j**l 发帖数: 2911 | 7 没有问题的,题目规定m = 0返回最后一个
初始设定current和mBehind的距离是m + 1,然后两个指针同步移动,当current变为
NULL(越过右边界)的时候mBehind即所求。
原来的代码用for (i = 0; i < m; i++)设定两个指针的距离是m, 当current指向最后一个
元素的时候停止同步移动。
改后的代码用for (i = 0; i <= m; i++)设定两个指针的距离是m + 1, 当current为NULL的时候停止同步移动。
当m = 0的时候,current和mBehind的距离是1,当current为NULL的时候mBehind指向最
后一个元素
当m = 1的时候,current和mBehind的距离是2,当current为NULL的时候mBehind指向倒
数第二个元素
如果规定m = 1返回最后一个,只要初始设定current和mBehind的距离是m就可以了
话。
【在 v***u 的大作中提到】 : 我觉得这个部分有问题: : while (current) : { : current = current->next; : mBehind = mBehind->next; : } : 你找的是m-1 to last不是m to last了,因为mBehind多移动了一个,如果这样写的话。 : 向大家求教,谢谢!
|
v***u 发帖数: 40 | 8 恩,谢谢耐心讲解,你说的很对,我之前忽略了设置mbehind的指针时候两者的区别,
你这样一讲,我才意识到。很对!
赞! |
c**y 发帖数: 172 | 9 If we want to return NULL when m < 0, can we do as follows?
Element *findMToLastElement(Element *head, int m)
{
if (m < 0) {
return NULL;
}
...
Your current code actually does the same, but I thought the above approach
is better in the sense that it makes the program more understandable. What
do you think?
【在 j**l 的大作中提到】 : 书中一个寻找链表倒数第m个元素的例子代码有误,这也恰恰是我们容易在书写白板代 : 码时候犯的错误,难免给面试官留下粗心的第一印象。 : 规定,如果m = 0, 则返回最后一个元素(下标从0开始,也可以定义m = 1返回最后一 : 个元素) : Element *findMToLastElement(Element *head, int m) : { : Element *current, *mBehind; : int i; : current = head; : for (i = 0; i < m; i++)
|