2012-06-02 2 views
3

단일 연결 목록 a->b->c->d->1->2->3->4->e->f->g->h->5->6->7->8이 제공됩니다. 이 목록을 a->1->b->2->c->3->d->4->e->5->f->6->g->7->h->8처럼 변경해야합니다.연결된 목록 변경

내 접근 방식은 목록에서 숫자를 제거하고 별도로 저장하는 추가 목록을 사용합니다. 그런 다음 목록을 병합합니다. 누군가 이렇게 할 수있는 더 좋은 기법을 제안 할 수 있습니까?

+5

제약 조건은 무엇입니까? – dirkgently

+0

어느 쪽이 더 낫습니까? 시각? 공간? – Tudor

+0

둘 다 더 좋고, 그렇지 않다면 시간. – nikhil

답변

8

두 개의 반복기가 있습니다. 하나 (반복자 A)가 목록을 통해 실행되고, 숫자를 눌렀을 때 멈추고 다른 하나 (반복자 B)가 목록 시작 부분에 머 무르도록하십시오. 숫자를 쳤을 때, 반복자 A의 노드 다음에 반복자 A에 노드를 삽입 한 다음 반복자 B를 위로 이동하십시오. 이 방법으로 별도의 목록을 작성할 필요가 없습니다.

편집 : iterator A에서 항목을 B에 삽입 한 후 제거하십시오 (잡기 위해 튜더 덕분에).

+0

반복자 A에서 번호를 삭제하는 것을 잊었습니다. 어쨌든, 나에게서 +1하십시오. – Tudor

+2

삽입 및 제거 대신 포인터를 바꾸기 만하면됩니다. – dirkgently

+0

포인터 교환이 어떻게 작동합니까? b를 잘못된 위치로 이동하지 않습니까? – nikhil

1

2 개의 포인터를 가져 와서 번호를 얻을 때까지 2 번째 포인터를 증가시키고 숫자를 얻 자마자 여기에서 노드를 제거하고 첫 번째 포인터 뒤에 삽입하십시오.

면접자는 list가 null 인 경우와 같이 두 노드 (1- 문자 & 1-int)와 문자 노드와 정수 노드의 수가 다른 경우 블록 등의 번호로 표시합니다.