-
Notifications
You must be signed in to change notification settings - Fork 62
/
doubly_linkedlist.go
140 lines (119 loc) · 2.17 KB
/
doubly_linkedlist.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
package doubly_linkedlist
import "fmt"
//双向链表的实现
//节点定义
type ListNode struct {
val interface{}
prev, next *ListNode
}
//新建节点
func newNode(val interface{}) *ListNode {
return &ListNode{val, nil, nil}
}
//链表定义
type LinkedList struct {
head *ListNode
size int
}
//新建链表
func New() *LinkedList {
return &LinkedList{nil, 0}
}
//插入数据到链表头部
func (lis *LinkedList) PushFront(val interface{}) *ListNode {
node := newNode(val)
if lis.head != nil {
lis.head.prev = node
node.next = lis.head
}
lis.head = node
lis.size++
return node
}
//插入数据到链表尾部
func (lis *LinkedList) PushBack(val interface{}) *ListNode {
if lis.head == nil {
return lis.PushFront(val)
}
node := newNode(val)
p := lis.head
for p.next != nil {
p = p.next
}
p.next = node
node.prev = p
lis.size++
return node
}
//在某个节点之后插入数据
func (lis *LinkedList) PushAfter(p *ListNode, val interface{}) *ListNode {
if p == nil {
return nil
}
next := p.next
node := newNode(val)
node.next = next
p.next = node
node.prev = p
if next != nil {
next.prev = node
}
lis.size++
return node
}
//在某个节点之前插入元素
func (lis *LinkedList) PushBefore(p *ListNode, val interface{}) *ListNode {
if p == nil {
return nil
}
node := newNode(val)
prev := p.prev
if prev == nil {
lis.PushFront(val)
} else {
p.prev = node
node.next = p
prev.next = node
node.prev = prev
lis.size++
}
return node
}
//删除节点
func (lis *LinkedList) Delete(p *ListNode) {
if p == nil || lis.head == nil {
return
}
//删除的是头节点
if p == lis.head {
lis.head = p.next
} else {
prev, next := p.prev, p.next
prev.next = next
if next != nil {
next.prev = prev
}
}
lis.size--
}
//根据值查找节点
func (lis *LinkedList) Find(val interface{}) *ListNode {
if lis.head == nil {
return nil
}
p := lis.head
for p != nil && p.val != val {
p = p.next
}
return p
}
func (lis *LinkedList) Size() int {
return lis.size
}
//打印所有链表数据
func (lis *LinkedList) PrintData() {
for p := lis.head; p != nil; p = p.next {
fmt.Print(p.val, " ")
}
fmt.Println()
}