forked from krahets/hello-algo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request krahets#218 from nuomi1/feature/linked_list-Swift
feat: add Swift codes for linked_list article
- Loading branch information
Showing
11 changed files
with
244 additions
and
73 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
91 changes: 91 additions & 0 deletions
91
codes/swift/chapter_array_and_linkedlist/linked_list.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
/** | ||
* File: linked_list.swift | ||
* Created Time: 2023-01-08 | ||
* Author: nuomi1 ([email protected]) | ||
*/ | ||
|
||
import utils | ||
|
||
/* 在链表的结点 n0 之后插入结点 P */ | ||
func insert(n0: ListNode, P: ListNode) { | ||
let n1 = n0.next | ||
n0.next = P | ||
P.next = n1 | ||
} | ||
|
||
/* 删除链表的结点 n0 之后的首个结点 */ | ||
func remove(n0: ListNode) { | ||
if n0.next == nil { | ||
return | ||
} | ||
// n0 -> P -> n1 | ||
let P = n0.next | ||
let n1 = P?.next | ||
n0.next = n1 | ||
P?.next = nil | ||
} | ||
|
||
/* 访问链表中索引为 index 的结点 */ | ||
func access(head: ListNode, index: Int) -> ListNode? { | ||
var head: ListNode? = head | ||
for _ in 0 ..< index { | ||
head = head?.next | ||
if head == nil { | ||
return nil | ||
} | ||
} | ||
return head | ||
} | ||
|
||
/* 在链表中查找值为 target 的首个结点 */ | ||
func find(head: ListNode, target: Int) -> Int { | ||
var head: ListNode? = head | ||
var index = 0 | ||
while head != nil { | ||
if head?.val == target { | ||
return index | ||
} | ||
head = head?.next | ||
index += 1 | ||
} | ||
return -1 | ||
} | ||
|
||
@main | ||
enum LinkedList { | ||
/* Driver Code */ | ||
static func main() { | ||
/* 初始化链表 */ | ||
// 初始化各个结点 | ||
let n0 = ListNode(x: 1) | ||
let n1 = ListNode(x: 3) | ||
let n2 = ListNode(x: 2) | ||
let n3 = ListNode(x: 5) | ||
let n4 = ListNode(x: 4) | ||
// 构建引用指向 | ||
n0.next = n1 | ||
n1.next = n2 | ||
n2.next = n3 | ||
n3.next = n4 | ||
print("初始化的链表为") | ||
PrintUtil.printLinkedList(head: n0) | ||
|
||
/* 插入结点 */ | ||
insert(n0: n0, P: ListNode(x: 0)) | ||
print("插入结点后的链表为") | ||
PrintUtil.printLinkedList(head: n0) | ||
|
||
/* 删除结点 */ | ||
remove(n0: n0) | ||
print("删除结点后的链表为") | ||
PrintUtil.printLinkedList(head: n0) | ||
|
||
/* 访问结点 */ | ||
let node = access(head: n0, index: 3) | ||
print("链表中索引 3 处的结点的值 = \(node!.val)") | ||
|
||
/* 查找结点 */ | ||
let index = find(head: n0, target: 2) | ||
print("链表中值为 2 的结点的索引 = \(index)") | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,7 @@ | |
* Author: nuomi1 ([email protected]) | ||
*/ | ||
|
||
// 常数阶 | ||
/* 常数阶 */ | ||
func constant(n: Int) -> Int { | ||
var count = 0 | ||
let size = 100_000 | ||
|
@@ -14,7 +14,7 @@ func constant(n: Int) -> Int { | |
return count | ||
} | ||
|
||
// 线性阶 | ||
/* 线性阶 */ | ||
func linear(n: Int) -> Int { | ||
var count = 0 | ||
for _ in 0 ..< n { | ||
|
@@ -23,7 +23,7 @@ func linear(n: Int) -> Int { | |
return count | ||
} | ||
|
||
// 线性阶(遍历数组) | ||
/* 线性阶(遍历数组) */ | ||
func arrayTraversal(nums: [Int]) -> Int { | ||
var count = 0 | ||
// 循环次数与数组长度成正比 | ||
|
@@ -33,7 +33,7 @@ func arrayTraversal(nums: [Int]) -> Int { | |
return count | ||
} | ||
|
||
// 平方阶 | ||
/* 平方阶 */ | ||
func quadratic(n: Int) -> Int { | ||
var count = 0 | ||
// 循环次数与数组长度成平方关系 | ||
|
@@ -45,7 +45,7 @@ func quadratic(n: Int) -> Int { | |
return count | ||
} | ||
|
||
// 平方阶(冒泡排序) | ||
/* 平方阶(冒泡排序) */ | ||
func bubbleSort(nums: inout [Int]) -> Int { | ||
var count = 0 // 计数器 | ||
// 外循环:待排序元素数量为 n-1, n-2, ..., 1 | ||
|
@@ -64,7 +64,7 @@ func bubbleSort(nums: inout [Int]) -> Int { | |
return count | ||
} | ||
|
||
// 指数阶(循环实现) | ||
/* 指数阶(循环实现) */ | ||
func exponential(n: Int) -> Int { | ||
var count = 0 | ||
var base = 1 | ||
|
@@ -79,15 +79,15 @@ func exponential(n: Int) -> Int { | |
return count | ||
} | ||
|
||
// 指数阶(递归实现) | ||
/* 指数阶(递归实现) */ | ||
func expRecur(n: Int) -> Int { | ||
if n == 1 { | ||
return 1 | ||
} | ||
return expRecur(n: n - 1) + expRecur(n: n - 1) + 1 | ||
} | ||
|
||
// 对数阶(循环实现) | ||
/* 对数阶(循环实现) */ | ||
func logarithmic(n: Int) -> Int { | ||
var count = 0 | ||
var n = n | ||
|
@@ -98,15 +98,15 @@ func logarithmic(n: Int) -> Int { | |
return count | ||
} | ||
|
||
// 对数阶(递归实现) | ||
/* 对数阶(递归实现) */ | ||
func logRecur(n: Int) -> Int { | ||
if n <= 1 { | ||
return 0 | ||
} | ||
return logRecur(n: n / 2) + 1 | ||
} | ||
|
||
// 线性对数阶 | ||
/* 线性对数阶 */ | ||
func linearLogRecur(n: Double) -> Int { | ||
if n <= 1 { | ||
return 1 | ||
|
@@ -118,7 +118,7 @@ func linearLogRecur(n: Double) -> Int { | |
return count | ||
} | ||
|
||
// 阶乘阶(递归实现) | ||
/* 阶乘阶(递归实现) */ | ||
func factorialRecur(n: Int) -> Int { | ||
if n == 0 { | ||
return 1 | ||
|
@@ -133,39 +133,40 @@ func factorialRecur(n: Int) -> Int { | |
|
||
@main | ||
enum TimeComplexity { | ||
/* Driver Code */ | ||
static func main() { | ||
// 可以修改 n 运行,体会一下各种复杂度的操作数量变化趋势 | ||
let n = 8 | ||
print("输入数据大小 n =", n) | ||
print("输入数据大小 n = \(n)") | ||
|
||
var count = constant(n: n) | ||
print("常数阶的计算操作数量 =", count) | ||
print("常数阶的计算操作数量 = \(count)") | ||
|
||
count = linear(n: n) | ||
print("线性阶的计算操作数量 =", count) | ||
print("线性阶的计算操作数量 = \(count)") | ||
count = arrayTraversal(nums: Array(repeating: 0, count: n)) | ||
print("线性阶(遍历数组)的计算操作数量 =", count) | ||
print("线性阶(遍历数组)的计算操作数量 = \(count)") | ||
|
||
count = quadratic(n: n) | ||
print("平方阶的计算操作数量 =", count) | ||
print("平方阶的计算操作数量 = \(count)") | ||
var nums = Array(sequence(first: n, next: { $0 > 0 ? $0 - 1 : nil })) // [n,n-1,...,2,1] | ||
count = bubbleSort(nums: &nums) | ||
print("平方阶(冒泡排序)的计算操作数量 =", count) | ||
print("平方阶(冒泡排序)的计算操作数量 = \(count)") | ||
|
||
count = exponential(n: n) | ||
print("指数阶(循环实现)的计算操作数量 =", count) | ||
print("指数阶(循环实现)的计算操作数量 = \(count)") | ||
count = expRecur(n: n) | ||
print("指数阶(递归实现)的计算操作数量 =", count) | ||
print("指数阶(递归实现)的计算操作数量 = \(count)") | ||
|
||
count = logarithmic(n: n) | ||
print("对数阶(循环实现)的计算操作数量 =", count) | ||
print("对数阶(循环实现)的计算操作数量 = \(count)") | ||
count = logRecur(n: n) | ||
print("对数阶(递归实现)的计算操作数量 =", count) | ||
print("对数阶(递归实现)的计算操作数量 = \(count)") | ||
|
||
count = linearLogRecur(n: Double(n)) | ||
print("线性对数阶(递归实现)的计算操作数量 =", count) | ||
print("线性对数阶(递归实现)的计算操作数量 = \(count)") | ||
|
||
count = factorialRecur(n: n) | ||
print("阶乘阶(递归实现)的计算操作数量 =", count) | ||
print("阶乘阶(递归实现)的计算操作数量 = \(count)") | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,7 @@ | |
* Author: nuomi1 ([email protected]) | ||
*/ | ||
|
||
// 生成一个数组,元素为 { 1, 2, ..., n },顺序被打乱 | ||
/* 生成一个数组,元素为 { 1, 2, ..., n },顺序被打乱 */ | ||
func randomNumbers(n: Int) -> [Int] { | ||
// 生成数组 nums = { 1, 2, 3, ..., n } | ||
var nums = Array(1 ... n) | ||
|
@@ -13,7 +13,7 @@ func randomNumbers(n: Int) -> [Int] { | |
return nums | ||
} | ||
|
||
// 查找数组 nums 中数字 1 所在索引 | ||
/* 查找数组 nums 中数字 1 所在索引 */ | ||
func findOne(nums: [Int]) -> Int { | ||
for i in nums.indices { | ||
if nums[i] == 1 { | ||
|
@@ -25,14 +25,14 @@ func findOne(nums: [Int]) -> Int { | |
|
||
@main | ||
enum WorstBestTimeComplexity { | ||
// Driver Code | ||
/* Driver Code */ | ||
static func main() { | ||
for _ in 0 ..< 10 { | ||
let n = 100 | ||
let nums = randomNumbers(n: n) | ||
let index = findOne(nums: nums) | ||
print("数组 [ 1, 2, ..., n ] 被打乱后 =", nums) | ||
print("数字 1 的索引为", index) | ||
print("数组 [ 1, 2, ..., n ] 被打乱后 = \(nums)") | ||
print("数字 1 的索引为 \(index)") | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.