-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsinglelinkedlist.go
177 lines (150 loc) · 3.1 KB
/
singlelinkedlist.go
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
package linkedlist
import "fmt"
/*
单链表基本数据结构定义
*/
// ListNode 链表节点数据结构
type ListNode struct {
Next *ListNode
Value interface{}
}
// LinkedList 链表头节点
type LinkedList struct {
Head *ListNode
Length uint
}
// NewListNode 创建新节点
func NewListNode(v interface{}) *ListNode {
return &ListNode{nil, v}
}
// NewListNodeFromArray 从数组生成链表
func NewListNodeFromArray(array []interface{}) *LinkedList {
head := &LinkedList{Head: &ListNode{}}
cur := head.Head
for _, v := range array {
cur.Next = &ListNode{Value: v}
head.Length++
cur = cur.Next
}
return head
}
// MergeSortedList 合并有序链表
func MergeSortedList(a, b *LinkedList) *LinkedList {
if a == nil || a.Head == nil || a.Head.Next == nil {
return b
}
if b == nil || b.Head == nil || b.Head.Next == nil {
return a
}
mergedList := LinkedList{Head: &ListNode{}}
mergedPtr := mergedList.Head
aPtr := a.Head.Next
bPtr := b.Head.Next
for aPtr != nil && bPtr != nil {
if aPtr.Value.(int) < bPtr.Value.(int) {
mergedPtr.Next = aPtr
aPtr = aPtr.Next
} else {
mergedPtr.Next = bPtr
bPtr = bPtr.Next
}
mergedPtr = mergedPtr.Next
}
if aPtr != nil {
mergedPtr.Next = aPtr
} else {
mergedPtr.Next = bPtr
}
return &mergedList
}
// ToIntArray 将链表转换为整型数组
func (h *LinkedList) ToIntArray() []int {
array := make([]int, 0)
cur := h.Head.Next
for cur != nil {
array = append(array, cur.Value.(int))
cur = cur.Next
}
return array
}
// Print 打印链表
func (h *LinkedList) Print() {
cur := h.Head.Next
format := fmt.Sprintf("Length: %v Value: ", h.Length)
for nil != cur {
format += fmt.Sprintf("%+v", cur.Value)
cur = cur.Next
if nil != cur {
format += "->"
}
}
fmt.Println(format)
}
/*
Reverse 反转链表
时间复杂度:O(N)
*/
func (h *LinkedList) Reverse() {
if h.Head == nil || h.Head.Next == nil || h.Head.Next.Next == nil {
return
}
cur := h.Head.Next
var preNode, nextNode *ListNode
for cur != nil {
nextNode = cur.Next
cur.Next = preNode
preNode = cur
cur = nextNode
}
h.Head.Next = preNode
}
// HasCycle 检测链表是否有环
func (h *LinkedList) HasCycle() bool {
if h.Head == nil || h.Head.Next == nil {
return false
}
slow := h.Head.Next
fast := h.Head.Next
for fast != nil && fast.Next != nil {
slow = slow.Next
fast = fast.Next.Next
if slow == fast {
return true
}
}
return false
}
// DeleteBottomNode 删除链表倒数第n个节点
func (h *LinkedList) DeleteBottomNode(n int) {
if n <= 0 || nil == h.Head || nil == h.Head.Next {
return
}
fast := h.Head
for i := 0; i < n; i++ {
fast = fast.Next
if fast == nil {
return
}
}
slow := h.Head
for fast.Next != nil {
slow = slow.Next
fast = fast.Next
}
slow.Next = slow.Next.Next
}
// FindMiddleNode 获取中间节点
func (h *LinkedList) FindMiddleNode() *ListNode {
if nil == h.Head || nil == h.Head.Next {
return nil
}
if nil == h.Head.Next.Next {
return h.Head.Next
}
slow, fast := h.Head, h.Head
for nil != fast && nil != fast.Next {
slow = slow.Next
fast = fast.Next.Next
}
return slow
}