๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋ ธ๋ ๊ตฌ์ฑ : ๋ฐ์ดํฐ + link(๋ค์ ๋ ธ๋์ ๋ํ ์ฐ๊ฒฐ ๊ณ ๋ฆฌ. ํฌ์ธํฐ ํน์ ๋ ํผ๋ฐ์ค)
์ฒซ ๋ฒ ์งธ ๋ ธ๋ : ํค๋ header
๋ง์ง๋ง ๋ ธ๋ : ๊ผฌ๋ฆฌ tail. link๋ ๋น์๋๊ฑฐ๋ null๋ก ์ง์ ํจ
๋ ธ๋์ link๋ ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํธ๋ ๋ ํผ๋ฐ์ค๋ก๋ง ๊ตฌ์ฑ๋จ. ๊ทธ๋์ ์์ผ๋ก๋ง ์ข ์ฃผ ๊ฐ๋ฅ
๋ฆฌ์คํธ๋ฅผ ์์ ์ข ์ฃผํ๋ ค๋ฉด ํญ์ ์ฒซ ๋ฒ์งธ ์์๋ถํฐ ์์ํด์ผ ํ๋ค.
๋ฆฌ์คํธ์ ์๋ ๋ชจ๋ ์์์ ์์น๋ฅผ ํ์ ํ๋ ค๋ฉด ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ์์์ ๋ํ ํฌ์ธํฐ๋ ๋ ํผ๋ฐ์ค๊ฐ ์์ด์ผ ํ๋ค.
์ฒซ ๋ฒ์ฌ ์์์ ํฌ์ธํฐ๋ ๋ ํผ๋ฐ์ค๋ ๋ณดํต ๋ณ๋์ ์๋ฃ๊ตฌ์กฐ์ ์ ์ฅํจ.
๋ ธ๋. ์ฝํ๋ฆฐ์ผ๋ก ์์ฑ
class SinglyLinkedListElement<T>(val value: T, var next: SinglyLinkedListElement<T>? = null)
typealias ListElement<T> = SinglyLinkedListElement<T>
ํค๋์ ์ฝ์
//ํค๋์์ ์คํ
fun <T> ListElement<T>?.insertInFront(data: T) : ListElement<T>
= ListElement(value = data, next = this)
์ฝ์
//ํค๋์์ ์คํ
fun <T> ListElement<T>?.insert(data: T) : ListElement<T> {
if (this == null) return this.insertInFront(data)
var thisNode : ListElement<T> = this
var nextNode : ListElement<T>? = this.next
while(nextNode != null) {
thisNode = nextNode
nextNode = thisNode.next
}
thisNode.next = ListElement(value = data, next = null)
return this
}
์ ์ฒด ๋ฆฌ์คํธ ์ฝ๊ธฐ
//ํค๋์์ ์คํ
fun <T> ListElement<T>?.readAll() {
var node : ListElement<T>? = this
println("----- singly linked list read -----")
while(node != null) {
println("node data : ${node.value}")
node = node.next
}
println("----- node read done -----")
}
๊ฒ์
//ํค๋์์ ์คํ
fun <T> ListElement<T>?.search(data: T) : ListElement<T>? {
var node : ListElement<T>? = this
while (node != null && node.value != data) {
node = node.next
}
return node
}
์ญ์
ํค๋ ๋ ธ๋๋ฅผ ์ญ์ ํ ๊ฒฝ์ฐ, ๋ฆฌ์คํธ ์ ์ฒด๋ฅผ ์์ด๋ฒ๋ฆด ์ ์๋ค๋ ๋ฌธ์ ์ ๋ด์ฐฉ. ๊ณ ๋ฏผํ๋ค๊ฐ ์ญ์ ์์ ๊ฒฐ๊ณผ ๊ฐ์ผ๋ก Pair๋ฅผ ์ฐ๊ธฐ๋ก ํจ. ์ญ์ ๊ฒฐ๊ณผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ํค๋ ๋ ํผ๋ฐ์ค์ ์ญ์ ์คํ ๊ฒฐ๊ณผ Boolean ๊ฐ์ ๋ฃ๊ณ ๋ฐํํ๊ธฐ๋ก ํจ.
fun <T> ListElement<T>?.deleteListElement(data : T?) : Pair<ListElement<T>?, Boolean> {
if(this == null || data == null) return this to false
var preNode : ListElement<T>? = null
var node = this
while(node != null && node.value != data) {
preNode = node
node = node.next
}
if (node == null) return this to false
if (preNode == null) return node.next to true
preNode.next = node.next
return this to true
}
ํ ์คํธ
un testSinglyLinkedList() {
var head : ListElement<Int>? = ListElement(5, null).insertInFront(3).insert(4).readAll()
println()
(1..4).forEach {
println("๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ $it ๊ฐ์ด ์๋์ง ํ์ธ")
println("๊ฒฐ๊ณผ : ${head.search(it) != null}")
}
println()
head.deleteListElement(2).let {
println("2 ์ญ์ ์๋: ${it.second}")
it.first.readAll()
head = it.first
}
println()
head.deleteListElement(3).let {
println("3 ์ญ์ ์๋: ${it.second}")
it.first.readAll()
head = it.first
}
println()
head.deleteListElement(4).let {
println("4 ์ญ์ ์๋: ${it.second}")
it.first.readAll()
head = it.first
}
println()
head.deleteListElement(5).let {
println("5 ์ญ์ ์๋: ${it.second}")
it.first.readAll()
head = it.first
}
println()
head = head.insert(8)
head.readAll()
}
Q. ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ง์ง๋ง์์ m๋ฒ์งธ ์์
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ์ฃผ์ด์ก์ ๋ ๋ฆฌ์คํธ์ ๋งจ ๋ค์์ m๋ฒ ์งธ ์์๋ฅผ ์ฐพ์๋ด๋ ์๊ณ ๋ฆฌ์ฆ. "๋งจ ๋ค์์ m๋ฒ ์งธ ์์"๋ m = 0์ผ ๋ ๋ฆฌ์คํธ์ ๋ง์ง๋ง ์์๋ฅผ ๋ฐํํ๋ ๊ฒ
์๊ฐ, ๊ณต๊ฐ ํจ์จ์ ๋ชจ๋ ๊ณ ๋ คํด์, O(n) ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌํํ๊ธฐ ์ํด์, ๋ฆฌ์คํธ๋ฅผ ํ ๋ฒ ์ข ์ฃผํ ๋ ํ์ฌ์ ์์น์, ํ์ฌ๋ก๋ถํฐ m๋งํผ ๋จ์ด์ง ์์น๋ฅผ ๊ฐ์ด ์ด๋์ํค๋ฉด์ ๋ฆฌ์คํธ์ ๋ง์ง๋ง์ ๋๋ฌํด์ ๊ฐ์ ๊ตฌํ๋ ๊ฒ
fun <T> ListElement<T>?.findMeToLastElement(numOfGap : Int) : ListElement<T>? {
var current : ListElement<T>? = this ?: return null
for(index in 0 until numOfGap) {
if (current?.next != null)
current = current.next
else return null
}
var behind : ListElement<T>? = this
while (current?.next != null) {
current = current.next
behind = behind?.next
}
return behind
}
ํ ์คํธ
fun test() {
val head = ListElement<Int>(value = 1).insert(2).insert(3).insert(4).insert(5)
println("${head.findMeToLastElement(0)?.value}")
}
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋
ธ๋ ๊ตฌ์ฑ : link(์์ ์๋ ๋
ธ๋์ ๋ํ ํฌ์ธํฐ๋ ๋ ํผ๋ฐ์ค) + ๋ฐ์ดํฐ + link(๋ค์ ์ค๋ ๋
ธ๋์ ๋ํ ํฌ์ธํฐ๋ ๋ ํผ๋ฐ์ค)
์ฒซ ๋ฒ ์งธ ๋
ธ๋ : ๋จธ๋ฆฌ header. ์ด์ ๋
ธ๋์ ๋ํ link๋ ๋น์๋๊ฑฐ๋ null๋ก ์ง์ .
๋ง์ง๋ง ๋
ธ๋ : ๊ผฌ๋ฆฌ tail. ๋ค์ ๋
ธ๋์ ๋ํ link๋ ๋น์๋๊ฑฐ๋ null๋ก ์ง์ .
๋ฆฌ์คํธ ์ด๋ ๋ฐฉํฅ์ด๋ ์ข
์ฃผ ๊ฐ๋ฅํ๋ค.
์ด๋ค ์์์์ ์์ํ๋ ๋ฆฌ์คํธ ์ ์ฒด๋ฅผ ์ข
์ฃผํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
๋ ธ๋. ์ฝํ๋ฆฐ์ผ๋ก ์์ฑ
class DoubleyLinkedListElement<T>(
val value: T,
var previous: DoubleyLinkedListElement<T>? = null,
var next: DoubleyLinkedListElement<T>? = null)
์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๋ ๊ฒ๋ ์๊ณ , ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์๋ ๊ฒ๋ ์๋ค.
๋จธ๋ฆฌ๋ ๊ผฌ๋ฆฌ๊ฐ ์๋ค.
๋ชจ๋ ๋
ธ๋์์ ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ ๋ ํผ๋ฐ์ค์๋ ๋ฐ๋์ null์ด ์๋ ์ด๋ค ์์๊ฐ ๋ค์ด๊ฐ๋ค. ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ผ๋ฉด ์ด์ ํฌ์ธํฐ/๋ ํผ๋ฐ์ค๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
๋
ธ๋๊ฐ ํ๋ ๋ฐ์ ์๋ ๋ฆฌ์คํธ๋ผ๋ฉด ๊ทธ๋ฅ ์๊ธฐ ์์ ์ ๊ฐ๋ฆฌํจ๋ค.
์ข
์ฃผ ์ ๋ฌดํ๋ฃจํ๊ฐ ์๊ธฐ์ง ์๊ฒ ์ฃผ์ํด์ผ ํ๋ค. ์์์ ์ ์ ๋๋ก ํ์
ํ์ง ์์ผ๋ฉด ๋ฆฌ์คํธ๋ฅผ ํ์์ด ๋๊ฒ ๋๋ค.
'๊ณณ๊ฐ์์ ์ธ์ฌ๋๋ค > ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฉด์ ] ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ์์ด ๋ฉด์ ์ ์์ฃผ ์ฐ์ผ ์ ์๋ ์๋จ์ด (1) | 2024.11.11 |
---|---|
[Kotlin] ์ต๋๊ณต์ฝ์ & ์ต์๊ณต๋ฐฐ์ ๊ตฌํ๊ธฐ (0) | 2023.07.13 |
[Kotlin][Java] ByteArrays๋ฅผ 16์ง์(Hex) String์ผ๋ก ๋ณํ (0) | 2023.02.28 |
[Kotlin] Selection Sort (0) | 2023.01.12 |
[Kotlin]Bubble Sort (0) | 2023.01.12 |