링크 목록 프롬프트

체인 테이블은 상당히 유행하는 데이터 구조의 하나다.이런 구조와 관련된 임무는 보통 면접에서 찾을 수 있다.본문에서 우리는 매일의 체인 테이블 임무를 분해할 것이다.

체인 테이블은 한 항목이 다른 항목을 인용하는 체인 테이블이다.
체인 테이블 문제를 해결하는 데 가장 자주 사용하는 기술 중의 하나는 이중 슬라이더 기술이다.우리는 0이 아닌 빠른 슬라이더와 느린 슬라이더를 만들고, 느린 슬라이더를 앞으로 이동합니다.빠른 속도(예:)의 두 배입니다.
임무.체인 사이클
헤드, 체인 시계의 헤드를 정하고 체인 시계에 순환이 있는지 확인합니다.
만약 체인 시계에 어떤 노드가 연속으로 다음 바늘을 따라 다시 도착할 수 있다면 체인 시계에는 순환이 있다.내부에서pos는tail의 다음 바늘에 연결된 노드를 나타내는 인덱스입니다.pos는 매개 변수로 전달되는 것이 아닙니다.
체인 테이블에 순환이 있으면true로 돌아갑니다.그렇지 않으면 false로 돌아갑니다.

우리는 순환이 존재하는지 아닌지를 어떻게 알 수 있습니까?두 개의 슬라이더를 생성하면 느린 슬라이더가 순환에 들어갈 때 스피드 슬라이더가 1의 속도로 따라잡습니다.결국 그들은 만날 것이다.만약 순환이 없다면, 스피드 슬라이더는 비어 있을 것이다.나는 이 생각이 명확하기를 바란다.코드를 살펴보겠습니다.
'공공 블라우스 Cycle (목록 섹션 끄덕임)
if(head==null){
false 되돌리기;
}그렇지 않으면 {0}
ListNode slow = 머리;
ListNode fast= 머리;
        while(fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;

            if (slow == fast){
                return true;
            }
        }
    }
    return false;
}
`
우리는 어떻게 순환이 시작되는 노드를 찾습니까?앞의 알고리즘에서 알 수 있듯이 스피드 슬라이더는 N보 안에서 느린 슬라이더에 도달할 것이다.우리의 순환은 판재의 시작이 아닐 수 있기 때문에 느린 슬라이더가 X보 이후 순환의 시작에 가까울 때, 빠른 슬라이더는 X*2를 이동할 것이다.가장 빠른 거리는 N-2*X보입니다.다른 한편, 빠른 걸음마다 느린 걸음을 따라잡는다.사실은 느린 것보다 빠른 것이 N-2배라는 것을 증명한다.매번 1로 쫓아갈 때마다, 달리기와 조깅자는 점 N-X에서 만난다. 이것은 우리가 어떤 슬라이더를 침대 시트의 시작으로 이동하고, 교차점과 머리에서 한 걸음 한 걸음 달리기를 이동할 수 있다는 것을 의미한다.그들이 만나는 곳은 순환의 시작이 될 것이다.만약 네가 알고리즘에 대해 아직 의문이 있다면 적어라.나는 기꺼이 대답한다.
코드를 살펴보겠습니다.
`공통 ListNode 테스트 주기(ListNode 헤드)
if(head==null | | head.next==null){
null로 돌아가기;
}
ListNode slow = 머리;
ListNode fast= 머리;
    while (fast != null && fast.next != null){
        slow = slow.next;
        fast = fast.next.next;

        if (slow == fast){
            break;
        }
    }

    if (fast == null || fast.next == null) {
        return null;
    }
    slow = head;

    while (slow != fast){
        slow = slow.next;
        fast = fast.next;
    }
    return slow;
} `
오, 다음 도전이 정말 좋아요.두 체인 시계의 교집합.

두 개의 단일 링크 목록headA와headB의 머리를 정하고 두 목록이 교차하는 노드를 되돌려줍니다.만약 두 개의 체인 시계가 전혀 교차하지 않았다면,null로 되돌아갑니다.
우리는 어떻게 이런 교차점을 찾습니까?침대 시트의 길이가 다르면?얘네가 전혀 안 사귀면?
나는 네가 먼저 침대 시트가 겹치는지 검사해 보라고 건의한다.
우리는 단지 한 페이지와 두 번째 페이지를 보기만 하면 결과는 같은 보트율이다.
이제 어떡하지?
처음 판재를 통과할 때, 우리는 각 판재의 길이를 계산할 수 있다.우리는 비교적 큰 노드에서 비교적 작은 노드를 빼서 부족한 노드 수를 얻는다.이 양이 있으면 너는 침대 시트를 따라 이동할 수 있다.그리고 나서 우리는 두 장의 종이 위에서 달리기를 시작해서 그것들의 교차점을 찾을 수 있다.멋있지 않아요?
`공용 ListNode getIntersectionNode(ListNode headA, ListNode headB)
ListNode aEnd=headA;
ListNode bEnd = 헤드 B;
int-aLength=1;
int-bLength=1;
    while (aEnd != null){
        aEnd = aEnd.next;
        aLength++;
    }

    while (bEnd != null){
        bEnd = bEnd.next;
        bLength++;
    }

    if (aEnd != bEnd) {
        return null;
    }

    aEnd = headA;
    bEnd = headB;
    int shift = 0;
    if (aLength > bLength) {
        shift = aLength - bLength;
        while (shift > 0){
            aEnd = aEnd.next;
            shift --;
        }
    } else if (bLength > aLength) {
        shift = bLength - aLength;
        while (shift > 0){
            bEnd = bEnd.next;
            shift --;
        }
    }

    while(aEnd != null) {
        if (aEnd == bEnd){
            return aEnd;
        }
        aEnd = aEnd.next;
        bEnd = bEnd.next;
    }

    return null;
} `
겸사겸사 목록 끝에서 특정 노드를 어떻게 삭제할지 생각해 보셨습니까?어쨌든, 우리는 단지 한 방향밖에 없다?어떻게 삭제합니까?
달리기와 달리기가 또 우리를 구하러 왔다.원하는 요소 수에 따라 빠른 슬라이더를 이동합니다.
그 다음에 스피드 슬라이더를 연결하고 스피드 슬라이더가 비어 있을 때까지 운행합니다.패스가 NULL이면 제거할 요소 앞에 느린 슬라이더가 있습니다.그게 다야.그리고 우리는 링크를 간단하게 다시 배열한 다음에 필요한 부분을 삭제할 수 있다.
`public ListNode removeNthFromEnd(ListNode 헤드, int n)
ListNode empty = 새 ListNode(),
    empty.next = head;
    ListNode slow = empty;
    ListNode fast = empty;

    for (int i = 0; i < n && fast != null; i++){
        fast = fast.next;
    }

    while (fast != null && fast.next != null){
        slow = slow.next;
        fast = fast.next;
    }

    slow.next = slow.next.next;
    return empty.next;
}
`
우리 총결산을 합시다.슬라이더 기술을 사용할 때 항상 다음 요소가 NULL인지 테스트합니다.순환을 끝내는 조건을 정확하게 확정해야 한다.요구 사항이 정확한지 확인하기 위해 다른 옵션을 실행합니다.

좋은 웹페이지 즐겨찾기