forked from wangzheng0822/algo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLinkedListAlgo.swift
111 lines (102 loc) · 2.71 KB
/
LinkedListAlgo.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//
// Created by Jiandan on 2018/10/13.
// Copyright (c) 2018 Jiandan. All rights reserved.
//
/**
* 1) 单链表反转
* 2) 链表中环的检测
* 3) 两个有序的链表合并
* 4) 删除链表倒数第n个结点
* 5) 求链表的中间结点
*/
import Foundation
/// 单链表反转
func reverseSinglyLinkedList<Element>(head: Node<Element>) -> Node<Element>? {
var reverseHead: Node<Element>?, currentNode: Node<Element>?, prevNode: Node<Element>?
currentNode = head
while currentNode != nil {
let nextNode = currentNode!.next
if nextNode == nil {
reverseHead = currentNode
}
currentNode!.next = prevNode
prevNode = currentNode
currentNode = nextNode
}
return reverseHead
}
/// 检测环
func hasCircle<Element>(head: Node<Element>) -> Bool {
var fast = head.next
var slow: Node<Element>? = head
while fast != nil {
if fast === slow {
return true
}
fast = fast!.next?.next
slow = slow!.next
}
return false
}
/// 两个有序的链表合并
func mergeSortedLists<Element: Comparable>(headA: Node<Element>?, headB: Node<Element>?) -> Node<Element>? {
guard let headA = headA else {
return headB
}
guard let headB = headB else {
return headA
}
var head: Node<Element>?, tail: Node<Element>?
var nodeA: Node<Element>? = headA, nodeB: Node<Element>? = headB
if nodeA!.value! < nodeB!.value! {
head = nodeA
nodeA = nodeA!.next
} else {
head = nodeB
nodeB = nodeB!.next
}
tail = head
while nodeA != nil, nodeB != nil {
if nodeA!.value! < nodeB!.value! {
tail!.next = nodeA
nodeA = nodeA!.next
} else {
tail!.next = nodeB
nodeB = nodeB!.next
}
tail = tail!.next
}
if nodeA != nil {
tail?.next = nodeA
} else {
tail?.next = nodeB
}
return head
}
/// 删除倒数第n个结点
func deleteNode<Element>(at lastNum: Int, in head: Node<Element>) {
var slow: Node<Element>? = head
var fast: Node<Element>? = head
var num = 1
while fast != nil, num < lastNum {
fast = fast!.next
num += 1
}
var prevNode: Node<Element>?
while fast != nil {
prevNode = slow
fast = fast!.next
slow = slow!.next
}
prevNode?.next = slow?.next
}
/// 求链表的中间结点
func halfNode<Element>(in head: Node<Element>) -> Node<Element>? {
var slow: Node<Element>? = head
var fast: Node<Element>? = head
while fast?.next != nil, fast?.next?.next != nil {
fast = fast!.next?.next
slow = slow!.next
}
return slow
}