고급 역 목록

최근 코스 꽉 중추절 휴가 나머지 이틀은 브러시 알고리즘 문제로 돌아와. 철저하게 이해하는 목록이 비교적 일반적인 유형 플립.

 

전원 버튼 (92) 제목 : 제목 설명 : 위치에서 반전  m  로  해당  링크 된 목록. 스캔에 여행이 완료 반전이다 사용하십시오.

설명 :. 1  ≤  m  ≤  N-  사슬 길이 ≤.

예 :

입력 : 1-> 2-> 3-> 4 - > 5-> NULL, m = 2, N = 4 
출력 : 1-> 4-> 3-> 2-> 5-> NULL

아이디어 :

최종 노드에 포인터를 기록 간격, 기록 구간 m를 반대로 N 부분 반전 기능은 업 링크 반전 뜻

    공용  정적 ListNode reverseBetween (ListNode 헤드 INT m, INT N-) { 

        IF (== N-m) 복귀 헤드;
         //이 첫 번째 노드 생성 
        ListNode PHEAD를 = 새로운 새 ListNode (0 ) 
        pHead.next = 헤드; 
        ListNode 꼬리 = PHEAD ;
         // 이전 노드를 반전 할 필요하다고 생각하는 기간 
         ( INT I = 1이다.] <I은 m]은 I ++ ) 
            꼬리 = tail.next;
         // 새로운 시작점 부분적 반전리스트 
        ListNode nextHead = tail.next;
        사전 ListNode의  =널 (null) ; 
        ListNode 다음 = ;
         // m이주기 N 반전, 즉 N-m + 1 개 반전 노드 
        를위한은 ( int로 , I가 = N <- m, I = 0 I가 ++ ) { 
            다음 = nextHead. 다음, 
            nextHead.next = 전, 
            사전 = nextHead; 
            nextHead = 다음; 
        } 
        // 부분적으로 반전되어 사전 목록 헤드 노드 
        tail.next = 프리;
         //이 반전 목록의 마지막 노드 발견 
        그동안을 (pre.next ! = null이 ) { 
            사전 = Pre.next; 
        } 
        // 연결 
        pre.next = 다음,
         반환 pHead.next을; 
    }

 

버튼 (25)을 질의 유지 : 이의리스트의 세트 케이

주제 설명 :

목록 감안할 때, 각각의  k는  번째 노드의 집합을 뒤집은 반전 후 목록을 반환합니다.

k는  이하리스트의 길이와 동일한 양의 정수이다. 노드의 총 개수가 아닌 경우  k는하기  의 정수배 마지막 나머지 노드 원래 순서이다.

예 :

1-> 2-> 3-> 4 -> 5 :이리스트 주어 

K = 2, 리턴한다 : 2-> 1-> 4 -> 3 -> (5) 

K = (3)가 상기 반환한다 : 3 -> 2-> 1-> 4 -> 5

설명 :

  • 당신은 여분의 공간 알고리즘 상수를 사용할 수 있습니다.
  • 당신은 단지 내부 노드 값을 변경할 수 있지만 실제 노드 교환 할 필요가 없습니다.

아이디어 : 반전 포인터 레코드가 아니라 K로 돌아가려면, 머리와 꼬리 노드, 쓰기 기능의 부분 반전, 한 번 반전 모든 K의 일부가 될 필요가

공용  정적 ListNode reverseKGroup (ListNode 헤드 의 INT K) {
        IF (헤드 ==  || head.next ==  || K <= 1이다. )
            복귀 헤드; 
       ListNode currentNode = 헤드;
        // 얻기 노드 (k)와 마지막 요소 
         ( INT의 COUNT = 1]. COUNT <K; COUNT ++ ) { 
            currentNode = currentNode.next;
             //는 K 개의 반환하지 
            IF 합니다 (currentNode == null의 )
                 복귀 헤드; 
        } 
        ListNode 다음= CurrentNode.next;
         // 로컬 반전에서 
        뒷면 (헤드의 currentNode)
         // 재귀 다음 번 반전마다 K 
        head.next = reverseKGroup (이어서, K)
         반환 currentNode 단계; 
    } 

 공용  정적 ListNode 뒷면 ( 헤드 ListNode, ListNode 꼬리) {
         IF (헤드 ==  || head.next == null의 )
             복귀 헤드; 
        ListNode 사전 = ; 
        ListNode 다음 = ;
         그동안 ! (= 사전 꼬리) { 
            이어서= head.next; 
            head.next = 프리; 
            사전 = 헤드; 
            머리 = 다음; 
        } 
        반환 머리; 
    }

 

버튼 (143) 제목을 그대로 : 재 배열 목록을

주제 설명 :

단쇄 주어  L : L 0 → L 1 → ... →. L ** N- -1 → L의 N-, 재배치 이후진다 :  L 0 → L ** N-L . 1 → L ** N- -1 → L 2 → L ** N- -2 → ...

당신은 단지 내부 노드 값을 변경할 수 있지만 실제 노드 교환 할 필요가 없습니다.

예 :

목록이 주어 1- 2-> 3-> 4, 재 배열> 1-> 4 -> 2 -> 3 . 
리스트 주어진 1-> 2-> 3-> 4 -> 5, 1- 재정리 > 5-> 2-> 3-> 3.

아이디어 : 중간 노드 목록을 찾기 목록은이 개 목록에 병합, 두 부분, 반전의 후반으로 나누어 져

 공공  정적  무효 ReorderList (ListNode 헤드) {
         IF (헤드 ==  || head.next == )
             ; 
        ListNode P1 = 헤드; 
        ListNode P2 = 헤드;
         // 의 중간 노드의 목록을 찾아 
        그동안 (p2.next를! =  && p2.next.next =! ) { 
            P1 = p1.next] 
            P2 = p2.next.next는; 
        } 
        // 리스트가 두 부분으로 분할된다 
        P2 = p1.next; 
        p1.next= ; 
        P1 = 헤드;
         // 후반리스트 반전 
        ListNode 사전 = ; 
        ListNode 다음 = ; 
        ListNode가 head2 = P2;
         그동안 (= Head2 대신! ) { 
            다음 = head2.next; 
            head2.next = 미리, 
            미리 = head2; 
            head2 = 다음; 
        } 
        P2 = 중고;
         // 병합 두 목록
        ListNode next1; 
        ListNode next2; 
        반면 (! = P2 는 null ) { 
            next1 = p1.next; 
            next2 = p2.next; 
            p1.next = P2; 
            p2.next = next1; 
            P1 = next1; 
            P2 = next2; 
        } 
    }

 

추천

출처www.cnblogs.com/zengcongcong/p/11521719.html