자료구조,알고리즘
[Java, Python] Leetcode - 206. Reversed Linked List
mileh
2024. 11. 11. 00:58
문제
Given the head of a singly linked list, reverse the list, and return the reversed list.
간단하게 연결리스트가 주어지면 뒤집어서 반환하는 문제입니다.
풀이
- 초기화
- node는 현재 연결 리스트의 첫 번째 노드를 가리키고, prev는 None으로 설정됩니다. prev는 결국 역순으로 뒤집힌 리스트의 새로운 첫 번째 노드를 가리키게 될 것입니다.
- 반복문
- node가 None이 아닐 때까지 반복합니다. 즉, 리스트의 끝에 도달할 때까지 반복됩니다.
- 먼저, 현재 노드의 다음 노드를 next에 저장합니다. 이는 역순으로 리스트를 뒤집기 전에 원래의 리스트 구조를 기억하기 위함입니다.
- 그 다음, 현재 노드의 next 포인터를 이전 노드 (prev)로 변경하여 리스트를 역순으로 연결하기 시작합니다.
- prev를 현재 노드로 이동시키고, node를 다음 노드로 이동시킵니다.
- 반환
- 반복문이 끝나면, prev는 역순으로 뒤집힌 리스트의 새로운 head(첫 번째 노드)를 가리키고, 이 값을 반환합니다.
Python
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
node, prev = head, None
while node:
# node.next를 이전 prev 리스트로 계속 연결하면서 끝날 때까지 반복
next, node.next = node.next, prev
prev, node = node, next
return prev
Java
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode node = head;
while (node != null) {
// 다음 노드를 저장
ListNode next = node.next;
// 현재 노드의 다음을 이전 노드를 가리키도록 변경
node.next = prev;
// prev와 node를 한 단계 앞으로 이동
prev = node;
node = next;
}
// 역순으로 뒤집힌 리스트의 새로운 head 반환
return prev;
}
}
재귀 호출을 사용하는 방법으로도 해결할 수 있습니다. 노드가 없거나 마지막 노드일 때 까지 반복하여 반전하는 방법입니다. 코드가 더 직관적이긴 하지만 시간 복잡도 측면에서 조금 더 비효율적입니다.
Python
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if (head == None or head.next == None):
return head
newHead = self.reverseList(head.next)
head.next.next= head
head.next = None
return newHead
JAVA
class Solution {
public ListNode reverseList(ListNode head) {
// 재귀 종료 조건: 노드가 없거나 마지막 노드인 경우
if (head == null || head.next == null) {
return head;
}
// 나머지 리스트를 재귀적으로 반전
ListNode newHead = reverseList(head.next);
// 현재 노드 다음의 노드가 현재 노드를 가리키도록 설정
head.next.next = head;
head.next = null; // 현재 노드의 next를 null로 설정
return newHead;
}
}