swift 리트코드 문제풀이 - leetcode 206 역순 연결리스트

swift 리트코드 문제풀이 - leetcode 206 역순 연결리스트

 

206Reverse 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)

 

 

결과