최근 코스 꽉 중추절 휴가 나머지 이틀은 브러시 알고리즘 문제로 돌아와. 철저하게 이해하는 목록이 비교적 일반적인 유형 플립.
전원 버튼 (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; } }