我正在学习链表,问题是 - 编写一个函数来打印给定链表的中间项(假设LL有奇数个节点)。
方法1-遍历LL并使用计数器计算节点数。添加1(使其成为偶数),然后将计数器除以2(忽略数学上的差异)。再次遍历LL,但这次只到计数器项,然后返回。
我有三个问题 -
Q1 - 如果我在面试中被问到如何确定哪种算法效率更高,我该怎么办?我的意思是两个函数都遍历了LL一次半(第二个函数只有一个循环而不是两个循环,但它仍然遍历了LL一次半)...
Q2 - 由于两个算法的大O都是O(n),哪些参数会决定哪个算法更有效?
Q3 - 计算这种算法的效率的一般方法是什么?如果您能链接到合适的教程,我将非常感激...
谢谢
方法1-遍历LL并使用计数器计算节点数。添加1(使其成为偶数),然后将计数器除以2(忽略数学上的差异)。再次遍历LL,但这次只到计数器项,然后返回。
void GetMiddleTermMethod1(){
//Count the number of nodes
int counter = 0;
Node n = FirstNode;
while (n.next != null){
counter = counter + 1;
n = n.next;
}
counter=counter+1/2;
//now counter is equal to the half of the number of nodes
//now a loop to return the nth term of a LL
Node temp = FirstNode;
for(int i=2; i<=counter; i++){
temp = temp.next;
}
System.out.println(temp.data);
}
第二种方法 - 初始化两个节点的引用。一个每次遍历2个节点,另一个只遍历1个节点。当快引用到达null(LL的末尾)时,慢引用将已经到达中间并返回。
void GetMiddleTermMethod2(){
Node n = FirstNode;
Node mid = FirstNode;
while(n.next != null){
n = n.next.next;
mid = mid.next;
}
System.out.println(mid.next.data);
}
我有三个问题 -
Q1 - 如果我在面试中被问到如何确定哪种算法效率更高,我该怎么办?我的意思是两个函数都遍历了LL一次半(第二个函数只有一个循环而不是两个循环,但它仍然遍历了LL一次半)...
Q2 - 由于两个算法的大O都是O(n),哪些参数会决定哪个算法更有效?
Q3 - 计算这种算法的效率的一般方法是什么?如果您能链接到合适的教程,我将非常感激...
谢谢