How to correctly create a table that has multiple columns self reference another row?
In the relational model, each row represents a dataset representing a single item and so you do not 'refer' to another row's value.

The concept of an employee sharing a room of another employee is similar in fact to the relationship you already have of an employee having a manager. This could be represented similarly in the table like so: 


EmpNo |Designation     | ReportsTo | SharesRoomWith | Room
10    | Director       | NULL      | NULL           | 1
20    | Senior Manager | 10        | NULL           | 2
30    | Typist         | 20        | 10             | NULL
40    | Programmer     | 30        | NULL           | 4


Where a NULL in SharesRoomWith means that an employee has their own room.
You could then query the list of employees and their rooms:

-- Employees that have their own room
select
    e.EmpNo,
    e.Designation,
    e.Room
from Employee e
where e.SharesRoomWith is NULL

UNION 
-- Employees that share a room
select
    e.EmpNo,
    e.Designation,
    e.Room
from Employee e

join Employee e2
on e.SharesRoomWith = e2.EmpNo


to get:


EmpNo | Designation    | Room
10    | Director       | 1
20    | Senior Manager | 2
30    | Typist         | 1
40    | Programmer     | 4


This achieves the result that if the Director changes rooms, an update is only made in one location (the room number) and the typist's room will also reflect that change.

Note this design is not fully normalised so may not be an ideal solution, but demonstrates at least how you could represent that relationship.