https://m.hanbit.co.kr/store/books/book_view.html?p_code=B3450156021
์ด ๊ธ์ ์ฑ
'๋๋ฅผ ์๊ทนํ๋ ์๊ณ ๋ฆฌ์ฆ' ์์ ๋ฐฐ์ด ๋ด์ฉ์ ์ ๊ทน ์ฐธ๊ณ ํ๊ณ ์์ต๋๋ค.
๋ํ, ๋ชจ๋ ์๋ฃ๊ตฌ์กฐ ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ Swift๋ก ๊ตฌํํ๊ณ ์์์ ๋จผ์ ์๋ฆฝ๋๋ค.
๋๋ฅผ ์๊ทนํ๋ ์๊ณ ๋ฆฌ์ฆ
ํ๋ก๊ทธ๋๋จธ์๊ฒ ์๋ฃ๊ตฌ์กฐ, ์๊ณ ๋ฆฌ์ฆ์ ์ฐ๊ณผ ๊ฐ๋ค. ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์๊ธฐ์ ์ค๋ฅด๊ณ ๋ ์ค๋ฅด์ง๋ง, ์ ์์ ๋ฐ๊ธฐ๋ ์ฝ์ง ์๋ค. ๋ฐฐ์ฐ๊ธฐ๊ฐ ์ด๋ ต๊ณ ์ฌ๋ฏธ๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ๋ง์ ํ๋ก๊ทธ๋๋จธ๊ฐ
m.hanbit.co.kr
0. ์๋ก
๋ฐฐ์ด์ ์๊ณ ๊ณ์ ๊ฐ์?
๊ฐ์ ํ์
์ ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ผ๋ก ์ ์ฅ๋์ด ์๋ ์๋ฃ๊ตฌ์กฐ์
๋๋ค.
๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ผ๋ก ์ ์ฅ๋์ด ์๋ค๋ ํน์ง์ผ๋ก ์ธํด ๋น ๋ฅธ ์ ๊ทผ์๋์ ๊ฐ์ ์ ๊ฐ์ง๋๊ฒ์ด ํน์ง์ด๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋ฌ๋, ์ด๊ธฐ์ ํ ๋นํ ํฌ๊ธฐ ๋งํผ๋ง ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ ๋์ด์๋ ํฌ๊ธฐ์ ์๋ฃ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์
๋ ํฐ ๊ณต๊ฐ์ ํ ๋นํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ด์ฃผ์ํค๋ ๋ฑ ์ถ๊ฐ์ ์ธ ์์
์ด ํ์ํ ๊ฒ ๋ํ ํน์ง์
๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ์ฐ์์ ์ผ๋ก ์ ์ฅํ ์ ์์ผ๋ฉด์๋, ๋ฐ์ดํฐ ์ด์ฃผ๋ฑ์ ๋ฒ๊ฑฐ๋ก์ด ์์
์์ ๋ฒ์ด๋ ์ ์๋ ์๋ฃ๊ตฌ์กฐ๋ ์์๊น์?
๋ค ์๊ณ ๊ณ์๊ฒ ์ง๋ง, ๋งํฌ๋ ๋ฆฌ์คํธ๋ ์ด์ ์ ํฉํ ์๋ฃ๊ตฌ์กฐ ์
๋๋ค.
ํ๋์ ๋ฐ์ดํฐ์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ์ ๋ณด๊ฐ ๋ด๊ฒจ์์ด, ๊ณ์ํด์ ๋ฐ์ดํฐ๋ฅผ ๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌด๋ ๋ชจ์ต์ผ๋ก ์ฃผ๋ ์ฃผ๋ ๋ฌ ์ ์์ฃ .
๋งํฌ๋ ๋ฆฌ์คํธ์ ๋ํ ์๊ฐ๋ ์ด์ฏค ๋๋ด๊ณ , ์ด์๋ํ ๊ตฌํ์ ๊ตฌ์กฐ์ ์-์ฝ์ -ํ์-์ญ์ ์์ผ๋ก ์งํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1. ๊ตฌ์กฐ ์ ์
๋งํฌ๋ ๋ฆฌ์คํธ๋ ๋ฐ์ดํฐ์ ๋ค์ ์๋ฃ์ ๋ํ ์์น์ ๋ณด๋ก ์ด๋ฃจ์ด์ง ๋ฉ์ด๋ฆฌ๊ฐ, ์ฌ๋ฌ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌผ์ด ์ฃผ๋ ์ฃผ๋ ๋ฌ๋ ค์๋ ํํ์
๋๋ค.
๋ฐ๋ผ์ ์ด ๋ฉ์ด๋ฆฌ๋ฅผ '๋
ธ๋' ๋ผ๊ณ ๋ถ๋ฅด๊ณ , ๋ค์๊ณผ ๊ฐ์ด ์ ์ํด๋ณด๋๋ก ํ์ฃ .
class Node<T>{
var data:T?
var nextNode:Node<T>?
init(data: T? = nil, nextNode: Node<T>? = nil) {
self.data = data
self.nextNode = nextNode
}
deinit{
}
}
์ ๋ค๋ฆญ์ ๋ชจ๋ฅด์๋ ๋ถ์ Swift-์ ๋ค๋ฆญ์ ๊ณต๋ถํ๊ณ ์ค์๊ธธ ๋ฐ๋๋๋ค.
๋
ธ๋๋ ๋ฐ์ดํฐ์ ๋ค์ ๋
ธ๋์ ์์น๋ฅผ ์๊ณ ์์ด์ผ ํ๋ฏ๋ก ์ฝ๋์ ๊ฐ์ ๋ฉค๋ฒ๋ฅผ ๊ฐ์ต๋๋ค.
์ด์ ์ด๋ฅผ ์ค์ค์ด ์ฎ์ด๋ณผ๊น์?
๋น์๋ ์์ธ์ง์๋ ์ฒ์ ์์ธ์ง๊ฐ ์๊ธฐ ๋ง๋ จ์ด๋, ์ด๊ฒ์ ๋จธ๋ฆฌ๋ผ๊ณ ํด ๋๊น์.
๋ ์๊ฐํ ํ์ ์์ด, ์ง๊ธ๊น์ง ๋งํ ์ ๋ณด๋ฅผ ํ ๋๋ก ๊ฐ๋จํ๊ฒ ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
class SingleLinkedList<T>{
var head: Node<T>?
}
์, head(๋จธ๋ฆฌ)๋ฅผ ๊ฐ์ง ๋งํฌ๋ ๋ฆฌ์คํธ๊ฐ ์์ฑ๋์์ต๋๋ค!
์ด์ ์ฌ๋ฌ๋ถ์ ์ํ๋ ๋งํผ ์๋ฃ๋ค์ ๋ชจ์ ๋ณด๊ดํ ์ ์๊ฒ ๋์ต๋๋ค!
๊ทธ๋ฐ๋ฐ, ์ด๊ฑธ ์ด๋ป๊ฒ ์ฐ๋๊ณ ์?
๋คํ์
๋๋ค. ์ด๋์ ์จ์ผํ๋์ง ๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ ์ง๋ฌธ์ด๊ตฐ์. ์ฐจ๊ทผ์ฐจ๊ทผ ์์๊ฐ๋ณด๋๋ก ํฉ์๋ค.
2. ์ฝ์
๊ธฐ์ฐจ๋์ด๋ฅผ ์๊ฐํด ๋ด
์๋ค.
์ด๋ฏธ ๊ธฐ์ฐจ๋์ด๋ฅผ ํ๊ณ ์๋ ์ฌ๋์ ํ๋ ๋ ๋๋ฆฌ๊ณ ์ถ๋ค๋ฉด, ๋ค์ ์ค ํ๊ฐ์ง ๊ฒฝ์ฐ์ผ ๊ฒ๋๋ค.
- ๋งจ ์ฒซ ์ฌ๋ ์์ ์ถ๊ฐํ๋ค.
- ์ฌ๋๊ณผ ์ฌ๋ ์ฌ์ด์ ์ถ๊ฐํ๋ค.
- ๋งจ ๋ท ์ฌ๋ ๋ค์ ์ถ๊ฐํ๋ค.
1๋ฒ์ ๋จผ์ ์ดํด๋ณด๋ฉด, ์ด๋ฏธ ๊ธฐ์ฐจ๋์ด๋ฅผ ํ๊ณ ์๋ ์ฌ๋์ด ์๊ฑฐ๋ ์์ ์ ์๊ฒ ๊ตฐ์! ๋ง์น ์๋ขฐ๋ฉ๊ฑฐ์ ๊ณ ์์ด ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ปดํจํฐ๋ ์ด๋ฐ ์ ๋จธ์ ๋ฅ์ํ์ง ๋ชปํ๋ฏ๋ก, ๋๊ฐ์ง ๊ฒฝ์ฐ์ ๋ํด ๋๋ ์๋ ค์ค์ผ ํฉ๋๋ค.
///๋ฆฌ์คํธ์ ์ฒ์์ ๋
ธ๋ ์ถ๊ฐ
@discardableResult
func insertNodeAtFirst(_ newNode: Node<T>, _ idx: Int)->Node<T>?{
if self.head == nil{
self.head = newNode
return newNode
}
newNode.nextNode = self.head
self.head = newNode
return newNode
}
ํค๋๊ฐ ๋น์ด์๋ค๋ฉด ์ ๋
ธ๋๋ฅผ ํค๋๋ก, ํค๋๊ฐ ์ด๋ฏธ ์๋ค๋ฉด ํค๋์ ์๋ ๋
ธ๋๋ฅผ ์ ๋
ธ๋์ ๋ค์ ๋
ธ๋๋ก ๋ฌ์๋์ ํ
๋งํฌ๋ ๋ฆฌ์คํธ์ ์์ฒด์ ์ธ ํค๋๋ ์ ๋
ธ๋๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ฉ๋๋ค.
2๋ฒ์ ์ดํด๋ณผ๊น์. ํ์์น๊ธฐ ํ๋๋ ๊ธฐ์ฐจ๋์ด ๋น์ ๋ ์ด์ฏค ๊ทธ๋ง๋์ด๋ ์ดํดํ์ค๊ฑฐ๋ผ ์๊ฐํ๊ฒ ์ต๋๋ค.
๋
ธ๋์ ๋
ธ๋ ์ฌ์ด์ ์ ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์, ๋น ๋งํฌ๋ ๋ฆฌ์คํธ๋ ์ ๋
ธ๋๊ฐ ํค๋ ๋
ธ๋๊ฐ ๋๊ฒ ๊ตฐ์.
์ฝ์
ํ๋ ค๋ ์์น๊ฐ ์กด์ฌํ์ง ์๋ค๋ฉด ๋งจ ๋ง์ง๋ง์ ๋ฌ๊ฑฐ๋ ๋ฌ์ ์๋๋ก ํ ์๋ ์๊ฒ ์ต๋๋ค.
์ด ๊ฒฝ์ฐ์ ๋ฌ์ง ์๊ณ nil์ ๋ฐํํ๋๋ก ํด ๋ณผ๊น์?
func insertNodeAt(_ newNode: Node<T>, _ idx: Int)->Node<T>?{
if self.head == nil{
self.head = newNode
return newNode
}
var currentNode = head
for _ in 0..<(idx-1){
if currentNode == nil {return nil}
currentNode = currentNode?.nextNode
}
newNode.nextNode = currentNode?.nextNode
currentNode?.nextNode = newNode
return newNode
}
์ด์ ๋ฆฌ์คํธ์ ๋ง์ง๋ง์ ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
ํน์ ์์น๊น์ง ๋๋ฌํ๋ค๋ ์กฐ๊ฑด์ด ์์ผ๋ฏ๋ก, for๋ฌธ์ while๋ฌธ์ผ๋ก ๋ฐ๊พผ๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๊ฒ ๋ค์!
///๋ฆฌ์คํธ ๋ง์ง๋ง์ ๋
ธ๋ ์ถ๊ฐ
@discardableResult
func appendNode(_ newNode: Node<T>)->Node<T>{
if let head = self.head{
var tail = head
while(tail.nextNode != nil){
tail = tail.nextNode!
}
tail.nextNode = newNode
}else{
self.head = newNode
}
return newNode
}
2. ํ์
์ฌ์ค ์ฝ์
์์ ํ์๋กํ๋ ๋ชจ๋ ์์์ ์ฌ๋ฌ๋ถ๊ป์๋ ๊ฒฝํํ์
จ์ต๋๋ค.
'ํน์ ์์น์ ์ ๊ทผํ์ฌ, ์ง์ ๋ ์์
์ ์ํํ๋ค' ๊ฐ ๋งํฌ๋ ๋ฆฌ์คํธ์ ๋ชจ๋ ์ฐ์ฐ์ ๊ณตํต๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ด์ง์.
๊ทธ๋ ๋ค๋ฉด, ๋
ธ๋๋ฅผ ์ฝ์
ํ๋ ๊ฐ๊ฐ์ ํจ์๋ฅผ ์กฐ๊ธ ์์ ํ๋ฉด ๊ธ๋ฐฉ ๊ตฌํํ ์ ์๊ฒ ๊ตฐ์!
///๋ฆฌ์คํธ์ ํน์ ์์น์ ๋
ธ๋ ๋ฐํ
func getNodeAt(_ idx: Int)->Node<T>?{
if self.head == nil {return nil}
var currentNode = head
for _ in 0..<idx{
if currentNode == nil {return nil}
currentNode = currentNode?.nextNode
}
return currentNode
}
///๋ฆฌ์คํธ์ ์ฒซ ์์น์ ๋
ธ๋ ๋ฐํ
func getNodeAtFirst()->Node<T>?{
if self.head == nil{return nil}
return self.head
}
///๋ฆฌ์คํธ ๋ง์ง๋ง ์์น์ ๋
ธ๋ ๋ฐํ
func getLastNode()->Node<T>?{
if self.head == nil{return nil}
var currentNode = self.head
while(currentNode != nil){
currentNode = currentNode?.nextNode
}
return currentNode
}
3. ์ญ์
์ญ์ ๋ํ ์ฝ์ ์ ์์ฉ์ ๋๋ค. ์ญ์ ํ ๋ ธ๋์ ์ง์ ๋ ธ๋๊น์ง ์ ๊ทผํ์ฌ, nil์ ํ ๋นํ๋ฉด ๋๋จธ์ง๋ ๋๋ํ ARC๊ฐ ์ฒ๋ฆฌํ ์์ ์ด์ฃ .
///๋ฆฌ์คํธ์ ์ฒซ ๋
ธ๋ ์ ๊ฑฐ
@discardableResult
func removeFirst()->Node<T>?{
if self.head == nil{return nil}
self.head = self.head?.nextNode
return head
}
///๋ฆฌ์คํธ ๋ง์ง๋ง ๋
ธ๋ ์ ๊ฑฐ
@discardableResult
func removeLastNode()->Node<T>?{
if self.head == nil{
print("List is empty")
return nil
}
if self.head?.nextNode == nil {
var removeNode = self.head
self.head = nil
return removeNode
}
var currentNode = self.head
while(currentNode?.nextNode?.nextNode != nil){
if currentNode?.nextNode == nil {break}
currentNode = currentNode?.nextNode
}
var removedNode = currentNode?.nextNode
currentNode?.nextNode = nil
return removedNode
}
//๋ฆฌ์คํธ์ ํน์ ์์น์ ๋
ธ๋ ์ ๊ฑฐ
@discardableResult
func removeNodeAt(_ idx: Int)->Node<T>?{
if self.head == nil{
print("List is empty")
return nil
}
var currentNode = self.head
for _ in 0..<idx-1{
if currentNode?.nextNode?.nextNode == nil {break}
currentNode = currentNode?.nextNode
}
let removeNode = currentNode?.nextNode
currentNode?.nextNode = currentNode?.nextNode?.nextNode
return removeNode
}
๋ง์ฝ, ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค์ ์์น์ ๋
ธ๋๊ฐ ์๋ค๋ฉด ๋ง์ง๋ง ๋
ธ๋๋ฅผ ์ญ์ ํ๋๊ฒ์ผ๋ก ๊ตฌํํ์์ต๋๋ค๋ง...
์ด ๋ถ๋ถ์ ์ทจํฅ๊ป nil์ ๋ฐํํ๋๋ก ๊ตฌํํ์ค ์ ์๊ฒ ๋ค์!
์ด์ ์ ํจ์๋ค์ SingleLinkedList ํด๋์ค์ ๋ด๋๊ฒ์ผ๋ก ์ฝ๋ฉ์ ๋์
๋๋ค.
4. ๊ฒฐ๋ก
์ค๋์ ๋ฐฐ์ด๊ณผ ๋น์ทํ์ง๋ง ๋ค๋ฅธ ๋
์, '๋งํฌ๋ ๋ฆฌ์คํธ'์ ๋ํด ๋์ ์ฌ ๋ณด์์ต๋๋ค.
๋งํฌ๋ ๋ฆฌ์คํธ๋ ๋ฐฐ์ด์ ๋นํด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ์๋ก์ด ๋
ธ๋์ ์ถ๊ฐ/์ฝ์
/์ญ์ ๊ฐ ์ฝ๊ณ ๋น ๋ฆ
๋๋ค.
๋งํฌ๋ ๋ฆฌ์คํธ์ ๋นํด ๋ฐฐ์ด์ ์์๋ฅผ ์ฝ์ ํ๊ฑฐ๋ ์ ๊ฑฐํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. - ํ์ฌ ๋
ธ๋์ ๋ค์ ๋
ธ๋๋ฅผ ์ป์ด์ค๋ ์ฐ์ฐ์์ ๋ฐ์ํ๋ ๋น์ฉ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
(๋ผ๊ณ ์ฑ ์ ์ ํ์์ผ๋, ๋งค์ฐ ์ ๋ค๊ณ ๋ฐ์๋ค์์ต๋๋ค)
์ด์ ๋๋น๋๋ ๋จ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํน์ ์์น์ ๋
ธ๋๋ฅผ ์ป๋๋ฐ ๋๋ ๋น์ฉ์ด ํฌ๊ณ , ์๋๋ ๋๋ฆฝ๋๋ค.
๋ฐฐ์ด์ ์์ ์๊ฐ ( O(1) ) ์ ๋ ธ๋๋ฅผ ์ป์ ์ ์๋ ๋ฐ๋ฉด, N๊ฐ์ ๋ ธ๋๋ฅผ ๊ฐ์ง ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ์ ์ต์์ ๊ฒฝ์ฐ Nํ์ ํ์๋ฃจํ( O(n) )๋ฅผ ๊ฑฐ์ณ์ผ ์ฐพ์ ์ ์์ต๋๋ค. - ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ์ํ์ฌ, 4byte์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ํ์ํฉ๋๋ค. (C๊ธฐ์ค)
(์ธ์ด๋ง๋ค ๋ค๋ฅธ ๋ถ๋ถ์ด๊ณ , Swift๋ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด Node<Any>? ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐ์ด๋ณด์์ ๋ 8๋ฐ์ดํธ์์ ํ์ธํ์์ต๋๋ค) - print(MemoryLayout<Node<Any>?>.size) //8
์ด๋ก์จ ๋งํฌ๋ ๋ฆฌ์คํธ, ์ ํํ '์ฑ๊ธ' ๋งํฌ๋ ๋ฆฌ์คํธ์ ๊ฐ๋จํ ๊ตฌํ์ด ๋ง๋ฌด๋ฆฌ๋์์ต๋๋ค.
๋ช๋ช ๋ถ๋ค์ ์ฌ๋ฌ๋ถ์ ํด๋์ค์ ์ด๋ฆ์ด SingleLinkedList์ธ ๊ฒ๊ณผ, ์ฝ์
- ์ญ์ ์์ ํ๊ฒ ๋
ธ๋๊ฐ ์๋ ํ๊ฒ ์ง์ ์ ๋
ธ๋์ ์ ๊ทผํ์ฌ
์ผ๋ จ์ ๋ช
๋ น์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ํ๊ฐ๊ณผ ๋ถํธํจ์ ๋๋ผ์
จ์๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ง ๊ทธ๋ฐ๊ฐ์?
๊ทธ๋ค์ง ๋๋์ง๋ ์์ง๋ง, ๋ง์ ์ฌ๋๋ค์ด ๋ถํธํจ์ ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. '๋๋ธ' ๋งํฌ๋ ๋ฆฌ์คํธ๊ฐ ์ธ์์ ํ์ํ ๊ฒ์ ๋ณด๋ฉด ๋ง์ด์ฃ !
๋ค์ ๊ธ์์๋ ๋๋ธ ๋งํฌ๋ ๋ฆฌ์คํธ์ ๋ํด ์๊ธฐํ๊ณ , ๊ตฌํํด๋ณด๋๋ก ํ๋ ์๊ฐ์ ๊ฐ๊ฒ ์ต๋๋ค.
์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค!
(๋ค์ ๊ธ - https://bpeeper.tistory.com/28)
[DataStructure] ์ด์ค ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ Swift๋ก ๊ตฌํํ๊ธฐ
https://m.hanbit.co.kr/store/books/book_view.html?p_code=B3450156021 ์ด ๊ธ์ ์ฑ '๋๋ฅผ ์๊ทนํ๋ ์๊ณ ๋ฆฌ์ฆ' ์์ ๋ฐฐ์ด ๋ด์ฉ์ ์ ๊ทน ์ฐธ๊ณ ํ๊ณ ์์ต๋๋ค. ๋ํ, ๋ชจ๋ ์๋ฃ๊ตฌ์กฐ ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ Swift๋ก ๊ตฌํํ๊ณ ์์์
bpeeper.tistory.com
*์์ค์ฝ๋ ์ ๋ฌธ
//
// SingleLinkedList.swift
// Swift-Practice
//
// Created by Yune gim on 2024/03/20.
//
class SingleLinkedList<T>{
var head: Node<T>?
///๋ฆฌ์คํธ์ ํน์ ์์น์ ๋
ธ๋ ๋ฐํ
func getNodeAt(_ idx: Int)->Node<T>?{
if self.head == nil {return nil}
var currentNode = head
for _ in 0..<idx{
if currentNode == nil {return nil}
currentNode = currentNode?.nextNode
}
return currentNode
}
///๋ฆฌ์คํธ์ ์ฒซ ์์น์ ๋
ธ๋ ๋ฐํ
func getNodeAtFirst()->Node<T>?{
if self.head == nil{return nil}
return self.head
}
///๋ฆฌ์คํธ ๋ง์ง๋ง ์์น์ ๋
ธ๋ ๋ฐํ
func getLastNode()->Node<T>?{
if self.head == nil{return nil}
var currentNode = self.head
while(currentNode != nil){
currentNode = currentNode?.nextNode
}
return currentNode
}
///๋ฆฌ์คํธ์ ์ฒ์์ ๋
ธ๋ ์ถ๊ฐ
@discardableResult
func insertNodeAtFirst(_ newNode: Node<T>, _ idx: Int)->Node<T>?{
if self.head == nil{
self.head = newNode
return newNode
}
newNode.nextNode = self.head
self.head = newNode
return newNode
}
///๋ฆฌ์คํธ์ ์ค๊ฐ์ ๋
ธ๋ ์ถ๊ฐ
@discardableResult
func insertNodeAt(_ newNode: Node<T>, _ idx: Int)->Node<T>?{
if self.head == nil{
self.head = newNode
return newNode
}
var currentNode = head
for _ in 0..<(idx-1){
if currentNode == nil {return nil}
currentNode = currentNode?.nextNode
}
newNode.nextNode = currentNode?.nextNode
currentNode?.nextNode = newNode
return newNode
}
///๋ฆฌ์คํธ ๋ง์ง๋ง์ ๋
ธ๋ ์ถ๊ฐ
@discardableResult
func appendNode(_ newNode: Node<T>)->Node<T>{
if let head = self.head{
var tail = head
while(tail.nextNode != nil){
tail = tail.nextNode!
}
tail.nextNode = newNode
}else{
self.head = newNode
}
return newNode
}
///๋ฆฌ์คํธ์ ์ฒซ ๋
ธ๋ ์ ๊ฑฐ
@discardableResult
func removeFirst()->Node<T>?{
if self.head == nil{return nil}
self.head = self.head?.nextNode
return head
}
///๋ฆฌ์คํธ ๋ง์ง๋ง ๋
ธ๋ ์ ๊ฑฐ
@discardableResult
func removeLastNode()->Node<T>?{
if self.head == nil{
print("List is empty")
return nil
}
if self.head?.nextNode == nil {
var removeNode = self.head
self.head = nil
return removeNode
}
var currentNode = self.head
while(currentNode?.nextNode?.nextNode != nil){
if currentNode?.nextNode == nil {break}
currentNode = currentNode?.nextNode
}
var removedNode = currentNode?.nextNode
currentNode?.nextNode = nil
return removedNode
}
//๋ฆฌ์คํธ์ ํน์ ์์น์ ๋
ธ๋ ์ ๊ฑฐ
@discardableResult
func removeNodeAt(_ idx: Int)->Node<T>?{
if self.head == nil{
print("List is empty")
return nil
}
var currentNode = self.head
for _ in 0..<idx-1{
if currentNode?.nextNode?.nextNode == nil {break}
currentNode = currentNode?.nextNode
}
let removeNode = currentNode?.nextNode
currentNode?.nextNode = currentNode?.nextNode?.nextNode
return removeNode
}
func printAllNode(){
var currentNode = self.head
while(currentNode != nil){
print(currentNode?.data)
currentNode = currentNode?.nextNode
}
}
}
'learnings > Algorithm&DS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DataStructure] ํ 1๋ถ (1) | 2024.05.01 |
---|---|
[DataStructure] ์คํ (1) | 2024.05.01 |
[Algorithm] ์ฐจ๋๊ธฐ์ง ์๊ณ ๋ฆฌ์ฆ, ์คํ์ ์ฌ์ฉํ์ฌ ์ค์ ํ๊ธฐ๋ฒ์ ํ์ ํ๊ธฐ๋ฒ์ผ๋ก ๋ณํ (0) | 2024.04.05 |
[DataStructure] ํํ ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ Swift๋ก ๊ตฌํํ๊ธฐ (0) | 2024.03.26 |
[DataStructure] ์ด์ค ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ Swift๋ก ๊ตฌํํ๊ธฐ (0) | 2024.03.25 |