面接問題(二十二)(拡張)チェーンテーブルの中間ノードを求めます


タイトル:チェーンテーブルの中間ノードを求めます.チェーンテーブルノード数が偶数の場合は、中間の2つのノードのいずれかを返します.
構想: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)である.