单链表复习
1 # 实现单链表
2 class Node(object):
3 '''定义一个节点'''
4 def __init__(self,data):
5 # 因为每次都需要生成一个节点,写到类里面便于保存
6 self.data = data
7 # 保存节点的值
8 self.next = None
9 # 默认将节点的指向为空
10 # 二元组也可以实现节点 (data,next指针域) ,为了通用性不使用二元组
11
12 class DanLianBiao(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 == 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)
46 # 打印数据
47 cur = cur.next
48 # 向下遍历
49
50 def add(self,data):
51 '''链表头部添加元素'''
52 node = Node(data)
53 self._head = node
54 # 将节点指向头部
55 node.next = self._head
56 # 将头部作为节点的下一个元素
57
58
59 def append(self,data):
60 '''链表尾部添加元素'''
61 node = Node(data)
62 # 创建一个节点
63
64 # 特殊情况 第一个节点为空
65 if self.is_empty():
66 self._head = node
67 # 头节点为 node
68 else:
69 cur = self._head
70 while cur.next != None:
71 cur = cur.next
72 # cur.next.data = node.data
73 # 不需要添加数据
74 cur.next = node
75 # 添加节点
76
77 def insert(self,pos,data):
78 '''指定位置添加元素'''
79 # 如果为零位置
80 if pos <= 0:
81 self.add(data)
82 # 添加节点
83 elif pos > (self.length()-1):
84 # 到最后一个元素
85 self.append(data)
86 # 添加节点
87 else:
88 node = Node(data)
89 index = 0
90 cur = self._head
91 while index < pos :
92 # 遍历到 pos 前一个位置
93 index += 1
94 cur = cur.next
95 # 不断向下移动
96 node.next = cur.next
97 # 先和右面元素建立联系 防止与左面元素失联
98 cur.next = node
99
100 def remove(self,data):
101 '''删除节点'''
102 cur = self._head
103 pre = None
104 # 设置游标表示前一个游标
105 while cur != None:
106 if cur.data == data:
107 # 如果 cur 指向的节点为要删除的节点
108 if cur == self._head:
109 # 如果数据为头节点的数据
110 self._head = cur.next
111 # 跳过 cur
112 else:
113 # 如果不是头节点
114 pre.next = cur.next
115 # 跳过 cur 指向的节点
116 break
117 # 找到数据跳出循环
118 else:
119 # 如果还没有找到数据
120 pre = cur
121 cur = cur.next
122 # 向下移动
123
124 def search(self,data):
125 '''查找节点是否存在'''
126 cur = self._head
127 # 指向头节点
128 while cur.next != None:
129 # 如果下一个节点不为空
130 if cur.data == data:
131 # 如果找到了数据
132 return True
133 else:
134 cur = cur.next
135 # 继续向下寻找
136 return False
137 # 没有找到该数据
138
139
140
2020-04-14
本文来自博客园,作者:CodeYaSuo,转载请注明原文链接:https://www.cnblogs.com/hany-postq473111315/p/12695182.html