https://leetcode.com/problems/reorder-list/description/

코드설명

노드(Node) + 구현(Implementation) 을 활용합니다.

 

이 문제의 예시와 함께 살펴보겠습니다.

1 2 3 4 5 의 예시입니다.

 

먼저 저의 방식은, 

1. Size = 5 를 구한다.

2. Stack에 1과 2 를 (5 / 2 ) 만큼 이동하며 각각 순서대로 넣습니다. ( 이후에 후입 선출로 사용됩니다. )

3. size가 홀수이므로 가운데 위치 toNextPointer 에 3 을 참조시킵니다. (이때 Cycle을 삭제시키기 위해 toNextPointer의 next = null 로 수정해주어야 합니다. )

4. Stack에서 2를 POP. right에는 현재 head 값을 참조시키면 4가 됩니다.

5. 4 -> toNextPointer를 가리키도록 합니다. 2 -> 4 를 가리키도록 합니다. 그러면 2 -> 4 -> 3 이 완성됩니다.

6. toNextPointer가 2를 가리키도록 합니다.

...

...

위의 연결로직인 4번, 5번, 6번을 반복합니다.

 

문제에서 유의할점은,

메모리 객체는 힙에 존재하고,

우리가 만든 ListNode 포인터들은 스택(지역변수)로써 존재한다는 점 입니다.

그러므로, 우리의 포인터(참조)값들에 힙 객체의 값을 대입한다고 해도, 해당 힙에 존재하는 객체들이 변화하는것이 아닙니다.

코드

정답코드1입니다.

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
int size = 0;
ListNode dummy = new ListNode(-999);
dummy.next = head;
Stack<ListNode> leftStack = new Stack<>();
while(head != null){
head = head.next;
size += 1;
}
ListNode toNextPointer = null;
int tempSize = 0;
head = dummy.next;
while(tempSize++ < size / 2){
leftStack.push(head);
head = head.next;
}
if(size % 2 == 1){
toNextPointer = head;
head = head.next;
toNextPointer.next = null;
}
while(head != null && !leftStack.isEmpty()){
ListNode right = head;
ListNode toNextHeadStore = head.next;
ListNode left = leftStack.pop();
right.next = toNextPointer;
left.next = right;
toNextPointer = left;
head = toNextHeadStore;
}
return ;
}
}

+ Recent posts