Reverse Linked List - LeetCode

연결 리스트 뒤집기

문제는 일반적인데 활용도가 높은 문제로 쓰인다.

반복 구조로 뒤집기

Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]
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;
    }
}

public ListNode reverseList(ListNode head) {
    ListNode prev = null;
    ListNode node = head;

    while (node != null) {
        System.out.println("Current node value: " + node.val);
        ListNode next = node.next; // 현재 노드의 다음 노드 미리 지정
        System.out.println("Next node value: " + (next != null ? next.val : "null"));
        node.next = prev; // 현재 노드의 다음으로 이전 노드 지정
        System.out.println("node.next set to prev value: " + (prev != null ? prev.val : "null"));
        prev = node; // 이전 노드는 현재 노드로 지정
        System.out.println("Prev set to current node value: " + prev.val);
        node = next; // 미리 지정했던 다음 노드를 현재 노드로 변경
        System.out.println("Current node updated to next value: " + (node != null ? node.val : "null"));
        System.out.println("----");    }

    return prev;
}

public static void main(String[] args) {
    // 예제 리스트 노드 생성
    ListNode node5 = new ListNode(5);
    ListNode node4 = new ListNode(4, node5);
    ListNode node3 = new ListNode(3, node4);
    ListNode node2 = new ListNode(2, node3);
    ListNode head = new ListNode(1, node2);

    Solution solution = new Solution();
    ListNode reversedHead = solution.reverseList(head);

    // 결과 출력
    System.out.print("Reversed list: ");
    ListNode node = reversedHead;
    while (node != null) {
        System.out.print(node.val + " ");
        node = node.next;
    }
}