728x90
- 입력
1->2->3->4->5->NULL
- 출력
5->4->3->2->1->NULL
생각해 본것
1) 순서를 바꿔야 하므로 이걸 배열로 풀어서 바꿔보자.
2) 배열로 풀어서 다시 리스트로 넣는 방식
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def reverseList(self, head) -> ListNode:
q = []
if not head:
return head
node = head
# 리스트 변환
while node is not None:
q.append(node.val)
node = node.next
q = q[::-1]
nodes = head
while len(q) > 0:
nodes.val = q.pop(0)
nodes = nodes.next
return head
def makeNode(lst):
res = ptr = ListNode()
for item in lst:
ptr.next = ListNode(item)
ptr = ptr.next
return res.next
head = makeNode([1, 2, 3, 4, 5])
ans = Solution().reverseList(head)
while ans:
print(ans.val, end=' ')
ans = ans.next
처음에는 연결리스트를 배열로 반환해서 해봤다.
책에 있는걸 봐보니 반복 구조로 뒤집기가 있었는데
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def reverseList(self, head) -> ListNode:
node, prev = head, None
while node:
next, node.next = node.next, prev
prev, node = node, next
return prev
def makeNode(lst):
res = ptr = ListNode()
for item in lst:
ptr.next = ListNode(item)
ptr = ptr.next
return res.next
head = makeNode([1, 2, 3, 4, 5])
ans = Solution().reverseList(head)
while ans:
print(ans.val, end=' ')
ans = ans.next
while node 문을 풀어보면
next = node.next
node.next = prev
prev = node
node = next
이렇게 된다. 저 next를 temp로 이름만 바꿔보자.
temp = node.next
node.next = prev
prev = node
node = temp
그러면 뭔가 보인다..
temp = a
a = b
b = c
c = temp
바로 swap 형식..
이렇게 풀어쓰니까 바로 눈에 보여 좋았다.
앞으로 순서가 바뀌는 문제가 있으면 이런 swap을 써보면 편할 것 같다.
728x90
'알고리즘 > 파이썬' 카테고리의 다른 글
[파이썬 알고리즘] 홀짝 연결 리스트 (0) | 2022.05.16 |
---|---|
[파이썬 알고리즘]가장 긴 팰린드롬 부분 문자열 (0) | 2022.05.16 |
[파이썬 알고리즘] 연결리스트(Linked List) 기초. (0) | 2022.05.15 |
[파이썬 알고리즘] 두 정렬 리스트의 병합 (0) | 2022.05.14 |
[파이썬 알고리즘] 그룹 애너그램 (0) | 2022.05.14 |