2017-05-08 2 views
0

나는 어제 인터뷰를 가졌습니다. 이되면서, 면접관이 물었다 제일 먼저,이중 연결된 목록에서 삽입 작업의 영향을받는 포인터는 몇 개입니까?

"이중 연결리스트에서이, 얼마나 많은 포인터가 삽입 작업에 영향을받을 것인가?"이후


이었다 그는 특별히 요구하지 않았다 삽입 할 위치는 DLL에 얼마나 많은 노드가 있는지에 따라 다릅니다.

영향을받을 총 포인터는 목록이 비어 있는지 여부와 삽입이 이루어지는 위치에 따라 다릅니다.

그러나 그는 내가 확신했는지 여부를 말하지 않았습니다.

내가 맞았거나 뭔가를 놓쳤을까요?

+0

질문이 명확하지 않습니다. 정확히 "영향을받는"것은 무엇을 의미합니까? 독서? 쓴? 역 참조? 그리고 정확하게 "삽입"은 무엇을 의미합니까? 삽입 할 위치를 검색하는 것을 포함합니까? 아니면 실제 삽입 조작 만 참조할까요? –

+0

@ JörgWMittag "영향을 받았다"는 것은 내가 삽입 할 때 포인터를 다음 노드로 변경하고 새로운 노드로 옮겨야한다는 것을 의미합니다. – Barry

답변

0

나는 (두 노드로 둘러싸인) 목록 중간에 새 노드를 삽입 할 것인지 아니면 목록의 머리 또는 꼬리에 삽입 할 것인지에 따라 응답이 달라집니다. 다음과 같이

목록의 중간에 삽입 들어

는 새로운 노드에 잇기 :

A --- B 
    ^^ splice M in here 

A.next = M 
M.prev = A 
B.prev = M 
M.next = B 

따라서 네 개의 포인터 할당이 이루어집니다. 그러나 삽입이 머리 또는 꼬리에 있다면 두 포인터 지정 만 필요합니다.

TAIL (insert M afterward) 

TAIL.next = M 
M.prev = TAIL 
+0

결국 노드의 총 수에 의존하지 않습니다. 맞습니까? – Barry

+0

당신이하는 포인터 계산의 양은 노드의 수에 의존하지 않습니다. 그러나 이것은 링크 된 목록에 삽입하기위한 실행 시간이 목록의 크기에 의존하지 않는다고 말하는 것은 아닙니다. 오히려 정렬 된리스트의 경우, 실제로 삽입 작업을 시작하기 전에 삽입 지점을 찾기 위해'O (N * lgN) '시간이 필요합니다. –

+0

왜 O (N * log N)입니까? sorted * array *의 경우, 이진 검색을 통해 O (log N)에서 수행 할 수 있으며, 정렬 된 * list *의 경우 O (N) 이상이어야합니다 (최악의 경우, 모든 요소). 왜 최악의 경우에 모든 요소 이상을보아야하는지 명확하지 않습니다. –

관련 문제