코딩테스트/코딩테스트

[LeetCode]Reverse Linked List, JAVA 풀이

90만식 2021. 12. 5. 19:38
사용언어 : JAVA
난이도 :  Easy
문제 URL : https://leetcode.com/problems/reverse-linked-list/
참조 책 : 쓰면서 익히는 알고리즘과 자료구조(167~189page)

 

1.문제

-문제설명

Given the head of a singly linked list, reverse the list, and return the reversed list.

singly linked list가 주어지면, 역순으로 뒤집어서 반환하라.

 

-제약사항

  • The number of nodes in the list is the range [0, 5000].
  • -5000 <= Node.val <= 5000

Example 1

Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]

Example 2

 

Input: head = [1,2]
Output: [2,1]

Example 3

Input: head = []
Output: []
2.나의풀이

 1. 이전(prev), 현재(curr), 다음(next)를 유지 운영한다.
 2.현재 노드가 None(null)이 아닐때까지.
  - 현재(current)값을 임시 저장한다.

  - 현재 노드를 임시 저장한 다음 노드로 이동한다.

  - 현재(current)의 다음(next)를 이전(prev)를 가르키도록 업데이트 한다.

  - 이전(prev)를 현재 노드로 이동

 

그림으로 나타내면 아래와 같다.

 

 

 

head = 1일때,

-입력받은 head 값을 현재(current)값을 임시 저장한다.(current = head)

-입력받은 head값에 다음 노드의 값을 저장한다(head = head.next2)

-현재(current)의 다음(next)값을 이전(prev)를 가르키도록 업데이트 한다(current.next = prev)

    ※ prev 는 현재 null, 

- 이전(prev)을 현재 노드로 이동(prev = current) 

 

head = 2일때,

 

-head 값을 현재(current)값을 임시 저장한다.(current = head)

-head값에 다음 노드의 값을 저장한다(head = head.next2)

-현재(current)의 다음(next)값을 이전(prev)를 가르키도록 업데이트 한다(current.next = prev)

- 이전(prev)을 현재 노드로 이동(prev = current) 

 

이런식으로 노드가 끝날때까지 (head =null)  반복하게 되면 연결 리스트를 뒤집어서 반환 할 수있다.

 

 

 

3.코드구현(JAVA)

위의 풀이방법으로 코드를 구현하면 아래와 같다.

/**
 * 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 reverseList(ListNode head) {
        
        ListNode prev = null;
        
        while ( head != null ){
            ListNode current = head;
            head = head.next;
            current.next = prev;
            prev = current;
        }
        
        
        return prev;
    }
}