双链表复习
1 # 实现双链表
2 class Node(object):
3 # 前驱 数据 后继
4 def __init__(self,data):
5 self.pre = None
6 # 前驱
7 self.data = self.data
8 # 数据
9 self.next = None
10 # 后继
11
12 class DoubleLianBiao(object):
13 # 定义一个双链表 将节点连接起来
14 def __init__(self,node = None):
15 # 指向节点 如果没传递则使用 None
16 self._head = node
17 # 定义头节点,指向实例化类对象时传递的节点指向
18
19 def is_empty(self):
20 '''链表是否为空'''
21 return self._head is None
22
23 def length(self):
24 '''查询链表长度'''
25 cur = self._head
26 # cur 为当前指向的指针
27 count = 0
28 # 记录长度
29 while cur != None:
30 # 当前指向不为 None
31 count += 1
32 # 数量加 1
33 cur = cur.next
34 # 将指针对节点进行移动
35 # 如果第一个节点为 None ,依旧是返回 0
36 return count
37 # 返回节点数量
38
39
40 def travel(self):
41 '''遍历整个链表'''
42 cur = self._head
43 while cur != None:
44 # 如果不为空 则打印数据
45 print(cur.data,end = " ")
46 # 打印数据
47 cur = cur.next
48 # 向下遍历
49
50
51 def add(self,data):
52 '''链表头部添加元素'''
53 node = Node(data)
54 # 将节点指向头部
55 node.next = self._head
56 # 将头部作为节点的下一个元素
57 self._head = node
58 # 将 node 作为头节点
59 node.next.pre = node
60 # 牵右手 让 node 后的节点指向node
61
62 def append(self,data):
63 '''链表尾部添加元素'''
64 node = Node(data)
65 # 创建一个节点
66
67 # 特殊情况 第一个节点为空
68 if self.is_empty():
69 self._head = node
70 # 头节点为 node
71 else:
72 cur = self._head
73 while cur.next != None:
74 cur = cur.next
75 # cur.next.data = node.data
76 # 不需要添加数据
77 cur.next = node
78 # 添加节点
79 node.pre = cur
80 # 连接左面的两只手
81
82 def insert(self,pos,data):
83 '''指定位置添加元素'''
84 # 如果为零位置
85 if pos <= 0:
86 self.add(data)
87 # 添加节点
88 elif pos > (self.length()-1):
89 # 到最后一个元素
90 self.append(data)
91 # 添加节点
92 else:
93 node = Node(data)
94 index = 0
95 cur = self._head
96 while index < pos :
97 # 遍历到 pos 前一个位置
98 index += 1
99 cur = cur.next
100 # 不断向下移动
101 node.next = cur
102 # 右手:node 连接 当前指向的节点
103 node.pre = cur.pre
104 # 左手:node 的前一个节点为当前位置的前一个节点
105 cur.pre.next = node
106 # 左手:当前位置的前一个节点的下一个节点为 node 节点
107 cur.pre = node
108 # 右手:当前位置的前一个节点 为 node 节点
109
110 def remove(self,data):
111 '''删除节点'''
112 cur = self._head
113 # 设置游标表示前一个游标
114 while cur != None:
115 if cur.data == data:
116 # 如果 cur 指向的节点为要删除的节点
117 if cur == self._head:
118 # 如果数据为头节点的数据
119 self._head = cur.next
120 # 跳过 cur
121 if cur.next != None:
122 # 如果只有一个节点,None 没有pre属性
123 cur.next.pre = None
124 # 删除头节点后 头节点值为 None
125 else:
126 # 如果不是头节点
127 cur.pre.next = cur.next
128 # 左手:当前节点的前一个节点的后一个节点为当前节点的后一个节点
129 if cur.next != None:
130 # 查看是否是最后一个节点,None 没有 pre 属性
131 cur.next.pre = cur.pre
132 # 右手:当前节点的下一个节点的前一个节点为当前节点的前一个节点
133 break
134 # 找到数据跳出循环
135 else:
136 # 如果还没有找到数据
137 cur = cur.next
138 # 向下移动
139
140 def search(self,data):
141 '''查找节点是否存在'''
142 cur = self._head
143 # 指向头节点
144 while cur.next != None:
145 # 如果下一个节点不为空
146 if cur.data == data:
147 # 如果找到了数据
148 return True
149 else:
150 cur = cur.next
151 # 继续向下寻找
152 return False
153 # 没有找到该数据
2020-04-14
本文来自博客园,作者:CodeYaSuo,转载请注明原文链接:https://www.cnblogs.com/hany-postq473111315/p/12697287.html