Public IP Address: This is general IP address in a network, where the RAC node and non-RAC node can communicate with each other.
Virtual IP Address: Using virtual IP we can save our TCP/IP timeout problem because Oracle notification service maintains communication between each nodes and listeners. Once ONS found any listener down or node down, it will notify another nodes and listeners with same situation. While new connection is trying to establish connection to failure node or listener, virtual IP of failure node automatically divert to surviving node and session will be establishing in another surviving node. This process doesn't wait for TCP/IP timeout event. Due to this new connection gets faster session establishment to another surviving nodes/listener.
Scan IP address: It is an separate DNS server which resolves another 3 IP address. IT is very useful for scalability. Its a new feature in Oracle 11g. Before 11g if we add/delete new node from a cluster, all client's tns entry should be modified to make itself aware of node addition/deletion. But since this Scan IP listener is aware of all nodes addition/deletion information within the cluster, there is no need to modify anything at client's end.
Hope this helps.