-
Notifications
You must be signed in to change notification settings - Fork 62
/
Copy pathdoubly_linked_list.py
105 lines (85 loc) · 2.15 KB
/
doubly_linked_list.py
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
# 双向链表实现
class ListNode:
def __init__(self, val):
self.val = val
self.prev = None
self.next = None
class LinkdeList:
def __init__(self):
self.head = None
# 查找元素
def find(self, val) -> ListNode:
p = self.head
while p and p.val != val:
p = p.next
return p
# 添加节点至链表尾部
def add(self, val) -> ListNode:
node = ListNode(val)
if not self.head:
self.head = node
else:
p = self.head
while p.next:
p = p.next
p.next = node
node.prev = p
return node
# 在某个节点之后添加节点
def addAfter(self, p: ListNode, val: int):
if not p:
return None
node = ListNode(val)
n = p.next
node.next = p.next
p.next = node
node.prev = p
if n:
n.prev = node
return node
# 在某个节点之前插入节点
def addBefore(self, p: ListNode, val: int):
if not p:
return None
node = ListNode(val)
if p == self.head:
node.next, p.prev = p, node
self.head = node
else:
prev = p.prev
node.next, p.prev = p, node
prev.next, node.prev = node, prev
return node
# 删除链表中的节点
def delete(self, p: ListNode):
if not p:
return
if p == self.head:
self.head = p.next
else:
prev, back = p.prev, p.next
prev.next = p.next
if back:
back.prev = prev
# 打印所有的数据
def print(self):
p = self.head
while p:
print(p.val, end=' ')
p = p.next
print()
if __name__ == '__main__':
lis = LinkdeList()
n1 = lis.add(1)
lis.add(5)
n3 = lis.add(3)
n10 = lis.addAfter(n3, 10)
n20 = lis.addAfter(n10, 20)
lis.print()
lis.addBefore(n20, 15)
h = lis.addBefore(n1, -1)
lis.print()
lis.delete(n1)
lis.delete(h)
lis.delete(n20)
lis.print()