스칼라의 단방향 연결 리스트를 보다가,
자바로 먼저 구현해봐야겠다는 생각에 자바로 초간단 단방향 연결 리스트를 구현해보았다.
package kwo2002.java;
/**
* Created by kwo2002 on 2015-08-06.
*/
public class SingleNode<E> {
private SingleNode next;
private E e;
public SingleNode(E e) {
e = this.e;
}
public SingleNode(E e, SingleNode next) {
e = this.e;
next = this.next;
}
public void appendToTail(E e) {
SingleNode<E> end = new SingleNode<>(e);
SingleNode currentNode = this;
while (currentNode.next != null) {
currentNode = currentNode.next;
}
currentNode.next = end;
}
public SingleNode deleteNode(SingleNode head, E e) {
if (head.e.equals(e)) {
return head.next;
}
SingleNode n = head;
while (head.next != null) {
if (n.next.e.equals(e)) {
n.next = n.next.next;
return head;
}
n = n.next;
}
return head;
}
}
머리가 굳었는지 막상 구현해보려니 생각이 잘 나지를 않더라..
아무튼,
이번엔 스칼라의 단방향 연결 리스트를 보았다.
package kwo2002.scala
/**
* Created by kwo2002 on 2015-08-04.
*/
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
이걸로 끝이다.
List 에 데이터를 추가하고 싶으면
Cons("a", Cons("b", Nil))
위와 같이 하면된다.
자바에 비해 훨씬 간결하다.
왜그럴까?
스칼라는 함수형 프로그래밍이고 순수 함수를 지향한다.
스칼라로 배우는 함수형 프로그래밍 中 -
순수함수는 자료를 그 자리에서 변경하거나 기타 부수 효과를 수행하는 일이 없어야 한다. 따라서 함수적 자료구조는 정의에 의해 불변이 이다.
순수함수적 특성으로 인해 스칼라의 자료구조는 간단할 수 밖에 없다.
반면, 자바에서는 불변이가 아니다. 즉, 값이 바뀐다는 뜻이다.
그래서 node 의 next 에 값이 있는지 등을 검사하고 마지막에 값을 삽입해야하는 것이다.