-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdouble_list.go
150 lines (131 loc) · 3.11 KB
/
double_list.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
//双链表
package linerList
import (
"errors"
)
//双链表接口
type DoubleListInterface interface {
IsEmpty() bool //判断链表是否为空链表
Len() int //返回链表长度
Insert(i int, elem interface{}) (*DuLNode, error) //指定位置插入元素
Append(elem interface{}) *DuLNode //链表末尾插入元素
Get(i int) (*DuLNode, error) //获取链表中第i个元素
Remove(i int) (interface{}, error) //删除链表中第i个元素,并返回Elem值
Traverse(h traverseHandler) //遍历
}
type traversedHandler = func(k int, node *DuLNode)
//双链表节点
type DuLNode struct {
Elem interface{}
prev,next *DuLNode
}
type DoubleList struct {
head *DuLNode //指向头节点的指针
}
//初始化一个单链表
func InitDoubleList() *DoubleList {
head := &DuLNode{} //头结点
return &DoubleList{head:head}
}
//判断链表是否为空
func (l *DoubleList ) IsEmpty() bool {
return l.head.next == l.head.prev && l.head.next == l.head
}
//下一个节点
func (l *DuLNode) Next() *DuLNode {
return l.next
}
//上一个节点
func (l *DuLNode) Prev() *DuLNode {
return l.prev
}
//返回长度
func (l *DoubleList) Len() int {
var length int
var p *DuLNode
p = l.head
for p.Next() != nil {
length++
p = p.next
}
return length
}
//插入,从第i个位置插入一个元素 i范围 1 <= i <= 表长 + 1
//时间复杂度O(n)
func (l *DoubleList) Insert(i int, elem interface{})(*DuLNode, error) {
var p *DuLNode
var j int
p = l.head
j = 0
for p != nil && j < i-1 { //寻找i-1个数据节点
p = p.next
j++
}
if p == nil || j > i-1 {
return nil,errors.New("i小于1或者超出链表范围")
}
newNode := &DuLNode{Elem: elem,prev:p,next:p.next}
if p.next != nil {//非尾部插入
p.next.prev = newNode
}
p.next = newNode
return newNode,nil
}
//尾部追加元素
//时间复杂度O(n)
func (l *DoubleList) Append(elem interface{}) *DuLNode {
var p *DuLNode
p = l.head
for p.next != nil {
p = p.next
}
newNode := &DuLNode{Elem: elem,prev:p}
p.next = newNode
return newNode
}
//返回第i个元素
func (l *DoubleList) Get(i int) (*DuLNode, error) {
var p *DuLNode
var j int
p = l.head.next //第一个数据节点
j = 1 //数据节点下标
for p != nil && j < i { //循环查找第i个节点
p = p.next
j++
}
if p == nil || j > i {
return nil, errors.New("下标越界,元素不存在")
}
return p, nil
}
//删除并返回第i个元素
//时间复杂度O(n)
func (l *DoubleList) Remove(i int) (interface{}, error) {
var p *DuLNode
var j int
p = l.head //队头指针
j = 0 //队头下标
for p.next != nil && j < i-1 { //寻找第i个元素的前面一个元素
p = p.next
j++
}
if p.next == nil || j > i-1 { //下标越界
return nil, errors.New("下标越界,元素不存在")
}
elem := p.next.Elem
//free(p.next) 的操作GC来帮忙做了
p.next = p.next.next
return elem, nil
}
func (l *DoubleList) Traverse(h traversedHandler) {
var i int
i = 1
node, _ := l.Get(i)
for node != nil {
if h != nil {
h(i, node)
}
i++
node = node.Next()
}
}