[알고리즘] 단일 체인 표 의 마지막 k 번 째 요 소 를 찾 아 라.

2647 단어 면접 문제
문제 풀이 방향:
링크 의 마지막 k 번 째 요 소 를 구하 기 위해 가장 쉽게 생각 할 수 있 는 방법 은 먼저 단일 링크 를 한 번 훑 어보 고 전체 단일 링크 의 길이 n 을 구 한 다음 에 마지막 k 번 을 양수 n - k 번 으로 바 꾸 고 이 어 한 번 훑 어보 면 결 과 를 얻 을 수 있다.그러나 이런 방법 은 체인 표를 두 번 옮 겨 다 녀 야 한다. 첫 번 째 는 단일 체인 표 의 길 이 를 구 하 는 데 사용 되 고 두 번 째 는 정수 n - k 요 소 를 찾 는 데 사용 된다.  만약 에 처음부터 끝까지 링크 의 특정한 요소 부터 k 개의 요 소 를 옮 겨 다 니 며 링크 의 끝 에 도착 하면 요 소 는 바로 찾 아야 할 마지막 k 번 째 요소 입 니 다.디자인 은 다음 과 같다. 링크 의 모든 노드 요 소 를 차례대로 테스트 하고 k 개의 요 소 를 옮 겨 다 니 며 링크 의 끝 에 도 착 했 는 지 확인 하고 마지막 k 번 째 요 소 를 찾 을 때 까지 확인한다.이 방법 은 같은 요 소 를 여러 번 반복 할 것 입 니 다. 링크 의 대부분 요 소 는 k 개의 요 소 를 옮 겨 다 녀 야 합 니 다. 만약 에 링크 의 길이 가 n 이 라면 이 알고리즘 은 시간 복잡 도 는 O (kn) 급 이 고 효율 이 너무 낮 습 니 다.  또 다른 효율 적 인 방법 이 존재 한다.찾 는 과정 에서 두 개의 지침 을 설정 하여 그 중의 한 지침 이 다른 지침 보다 k - 1 단계 먼저 이동 한 다음 에 두 지침 이 동시에 앞으로 이동 하도록 합 니 다.선 행 된 포인터 가 NULL 을 가리 킬 때 까지 순환 합 니 다. 다른 포인터 가 가리 키 는 위 치 는 찾 는 위치 입 니 다.
프로그램 은 다음 과 같 습 니 다:
public Node findElem(Node head,int k){
        if(k<1 || head == null)
        {
            return null;
        }
        Node p1 = head;
        Node p2 = head;
        for (int i = 0; i < k - 1; i++) { //  k-1 
            if(p1.next != null){
                p1 = p1.next;
            }else {
                return null;
            }

        }
        while (p1 != null) {
            p1 = p1.next;
            p2 = p2.next;
        }
        return p2;
    }

좋은 웹페이지 즐겨찾기