swift 리트코드 문제풀이 - leetcode 206 역순 연결리스트
206. Reverse Linked List
문제
연결리스트를 뒤집어라
얼핏보고 좀 간한하네? 라고 생각했다.
연결리스트의 point를 이용해서도 뒤집을 수 있을 것 같은데 이번에도 swift의 배열을 이용해보기로 했다.
1.함수안에 빈배열을 선언한다.
2.입력 받은 연결 리스트를 while문을 돌면서 배열에 값을 넣어준다.
3.배열을 뒤집는다.
4.배열안의 요소를 연결리스로 만들어 준다.
끝~!
위의 아이디어를 토대로 소스코드를 작성해보았다.
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:CustomStringConvertible{
public var description: String{
guard let next = next else {
return "\(val)"
}
return "\(val) -> " + String(describing: next) + " "
}
}
//15.역순 연결 리스트 206
func reverseList(_ head: ListNode?) -> ListNode? {
///결과를 담을 배열
var resultArr:[Int] = []
///인자로 받은 연결 리스트의 개수 만큼 돌면서 빈배열에 value를 넣어준다.
var current = head
while current != nil {
resultArr.append(current?.val ?? 0)
current = current?.next
}
/// 배열의 요소들을 역순으로 만든다.
resultArr = resultArr.reversed()
var idx = resultArr.count - 1
/// 배열안의 요소들을 사용해서 연결리스트를 생성한다.
/// 꼬리 노드 부터 머리 노드 까지 역순으로 생성한다.
var nextNode:ListNode?
while idx >= 0{
///배열의 제일 마지막 요소라면 꼬리 노드가 된다.
if (idx == resultArr.count - 1) {
nextNode = ListNode(resultArr[idx])
}else{
let node = ListNode(resultArr[idx] , nextNode)
nextNode = node
}
idx -= 1
}
print("*resultArr : \(resultArr)")
print("*nextNode : \(nextNode)")
return nextNode
}
let e = ListNode(5)
let d = ListNode(4,e)
let c = ListNode(3,d)
let b = ListNode(2,c)
let a = ListNode(1,b)
print("a List : \(a)")
reverseList(a)
결과
'자료구조&알고리즘 > leetcode 풀이' 카테고리의 다른 글
swift 리트코드 문제풀이 - leetcode 2 두 수의 덧셈 (0) | 2022.08.05 |
---|---|
swift 리트코드 문제풀이 - leetcode 24 페어의 노드 스왑 (0) | 2022.08.04 |
swift 리트코드 문제풀이 - leetcode 21 두 정렬 리스트의 병합 (0) | 2022.08.03 |
swift 리트코드 문제풀이 - leetcode 234 팰린드롬 연결 리스트 - ver.2 (0) | 2022.08.01 |
swift 리트코드 문제풀이 - leetcode 234 팰린드롬 연결 리스트 (0) | 2022.08.01 |