알고리즘풀이
Leetcode: Reverse Linked List, 연결 리스트 뒤집기
batterflyyin
2021. 2. 10. 19:58
문제설명
- 단일 연결 리스트(Singly Linked List)의 노드를 역순으로 나열한 연결 리스트를 만든다.
- 재귀(recursive)와 반복(iterative) 방법이 있다.
문제풀이
- 반복문을 돌면서, 이전 값을 현재 가리키는 node의 next node로 할당한다.
- 옵셔널에 유의해야 한다. while 반복문을 돌며 옵셔널 바인딩을 사용하자.
- 반복문을 돌아 마지막에는 node 변수에 nil이 할당된다. 이 때, 마지막 반환 값이 nil이 되지 않도록 before 변수를 반환한다.
public class ListNode {
public var val: Int
public var next: ListNode?
public init() { self.val = 0; self.next = nil; }
public init(_ val: Int) { self.val = val; self.next = nil; }
public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
}
extension ListNode {
func print() -> String {
if let nextNode = next {
return "\(val) -> \(nextNode.print())"
} else {
return "\(val)"
}
}
}
func reverseList(_ head: ListNode?) -> ListNode? {
var node = head
var before: ListNode? = nil
while let n = node {
let next = n.next
n.next = before
before = node
node = next
}
return before
}
let n1 = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5)))))
print(n1.print()) // 1->2->3->4->5
let reversed = reverseList(n1)
print(reversed!.print()) // 5->4->3->2->1