面接問題(二十二)(拡張)チェーンテーブルの中間ノードを求めます
タイトル:チェーンテーブルの中間ノードを求めます.チェーンテーブルノード数が偶数の場合は、中間の2つのノードのいずれかを返します.
構想:2つのポインタを定義し、同時にチェーンテーブルのヘッダノードから出発し、1つのポインタが1回1歩、1つのポインタが1回2歩歩くことができます.速く歩くポインタがチェーンテーブルの末尾に着くと、ゆっくり歩くポインタがチェーンテーブルの真ん中にちょうどあります.
コード(テストコードを含む):
性能:チェーンテーブルを1回遍歴するため,時間複雑度はO(n)である.
構想:2つのポインタを定義し、同時にチェーンテーブルのヘッダノードから出発し、1つのポインタが1回1歩、1つのポインタが1回2歩歩くことができます.速く歩くポインタがチェーンテーブルの末尾に着くと、ゆっくり歩くポインタがチェーンテーブルの真ん中にちょうどあります.
コード(テストコードを含む):
public class FindMidInList
{
public static void main(String[] args)
{
Node[] list = new Node[args.length];
for(int i = 0 ; i < args.length; i++)
{
list[i] = new Node();
list[i].val = Integer.parseInt(args[i]);
}
for(int i = 0; i < args.length-1; i++)
list[i].next = list[i+1];
Node mid = findMid(list[0]);
System.out.println(mid.val);
}
public static Node findMid(Node head)
{
//
if(head == null)
return null;
Node pAhead = head, pBehind = head;
// pAhead pAhead.next null
while(pAhead != null && pAhead.next != null)
{
pAhead = pAhead.next.next;
pBehind = pBehind.next;
}
return pBehind;
}
}
class Node
{
int val;
Node next;
}
性能:チェーンテーブルを1回遍歴するため,時間複雑度はO(n)である.