https://leetcode.com/problems/odd-even-linked-list/description/
코드설명
구현(Implementation) 문제입니다.
문제를 이해하기 위해,
문제의 기본 접근은,
1. 홀수 노드끼리 연결
2. 짝수 노드끼리 연결
3. 홀수 첫번째 노드가 짝수 첫번쨰 노드를 가리키도록 연결
위 3가지를 구현하면 됩니다.
그 과정에서, 어떻게 1번, 2번 과정을 손쉽게 연결할 수 있는 것인가를 이해하기 위해서는,
첫번째 홀수, 짝수 노드가 하나의 그룹,
두번째 홀수, 짝수 노드가 하나의 그룹.
...
이렇게 연속된 2개가 하나의 그룹이라고 생각합니다.
그리고 이 그룹에서 뒤에 있는 짝수 노드를 기준으로 다음 그룹이 존재하는지, 존재하지 않는지를 체크하면서 이동한다면, 뒤에 그룹이 더 존재하는지 존재하지 않는지를 알 수 있습니다.
위의 조건을 구현한것이 아래입니다.
while(even != null && even.next != null){
even != null 일때는 마지막 그룹이 홀수로만 이루어져있을때,
even.next != null 일떄는 마지막 그룹이 홀수 짝수로 이루어져있고, 더이상 연결되어 있지 않을때를 의미합니다.
만약 두개 중 한개라도 null 이라면, 더 이상 연결할 수 없음을 의미하니, 멈추면 되겠습니다.
그림으로 보면,
(1) -> (2) -> (3) 인 경우.
(1) -> (2) -> (3) -> (4) 인경우로 생각해보면 될 것 같습니다.
더 이상 연결할 노드가 없지요.
코드
/** * 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 ListNode oddEvenList(ListNode head) { if(head == null || head.next == null) return head; ListNode odd = head; ListNode even = head.next; ListNode evenHead = even; while(even != null && even.next != null){ odd.next = even.next; odd = odd.next; even.next = odd.next; even = even.next; } odd.next = evenHead; return head; } }