CS DataStructure [Swift] LinkedList

[Swift] LinkedList

리스트의 다음 원소에 대한 연결고리(link, 포인터 또는 레퍼런스) 가 들어있다.
마지막 원소는 꼬리(tail) 라고 부르며, 연결고리는 비워두거나 nil 로 지정한다.
각각의 원소들은 자기 자신 다음에 어떤 원소인지만을 기억하고 있다.
Tree 구조의 근간이 되는 자료구조이며, 그 유용성이 드러난다.

조회 - O(n)

삽입 - O(1)

linkedList = LinkedList()
linkedList.append(0)
let head = linkedList.head
head?.next = Node(value: 2)

삭제

  • O(1)

원하는 위치에 삽입 / 삭제

  • O(n)
  • 위치에 삽입을 하고자 하면 원하는 위치를 Search 과정에 있어서 첫번째 원소부터 다 확인해봐야 한다는 것이다.
  • Array 와는 달리 논리적 저장 순서와 물리적 저장 순서가 일치하지 않기 때문이다. 이것은 일단 삽입하고 정렬하는 것과 마찬가지이다.

구현

public class Node<T> {
  var value: T
  var next: Node?
  weak var previous: Node?

  public init(value: T) {
    self.value = value
  }
}
public final class LinkedList<T> {
  private(set) var head: Node<T>?
  public init() {}

  public init(_ value: T) {
    head = Node(value: value)
  }
}
@discardableResult
public func insertInFront(value: T) -> LinkedList<T> {
  let newList = LinkedList(value)
  guard let head = head else { return newList }
  newList.head?.next = head
  return newList
}

@discardableResult
public func insertInFront(value: T) -> Node<T> {
  let newList = LinkedList(value)
  guard let head = head else { return newList.head! }
  newList.head!.next = head
  return newList.head!
}
public func first(where predicate: (Node<T>) -> Bool) -> Node<T>? {
  var node = head

  while let nd = node {
    if predicate(nd) {
      return nd
    }

    node = nd.next
  }
  return nil
}

댓글남기기