- 单链表是一种链式数据结构,物理存储方式是随机存储,访问方式是顺序访问
- 查找链表节点的时间复杂度是O(n)
- 不考虑插入、删除之前的查找节点的过程,插入、删除的时间复杂度是O(1)
下面为实现代码:
class Node(object):
def __init__(self, value=None, next=None):
self.value = value
self.next = next
class SingleLink(object):
def __init__(self):
self.head = Node()
def is_empty(self):
'''判断链表是否为空'''
return False if (self.head and self.head.value) else True
def add(self, value):
'''链表头部添加节点'''
new_node = Node(value)
if self.is_empty():
self.head = new_node
else:
new_node.next = self.head
self.head = new_node
def append(self, value):
'''链表尾部追加节点'''
new_node = Node(value)
if self.is_empty():
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
def insert(self, data, value):
'''找到val值为data的节点,在其后面插入新节点'''
if self.is_empty():
print('找不到要查询的数据,当前链表为空')
return False
else:
current = self.head
while True:
if current.value == data:
new_node = Node(value)
new_node.next = current.next
current.next = new_node
break
elif current.next is None:
print('找不到要查询的数据')
break
else:
current = current.next
def remove(self, value):
'''删除val值为value值的节点'''
if self.is_empty():
print('链表为空')
return False
else:
current = self.head
pre = None
while True:
if current.value == value:
if pre is None:
self.head = current.next
else:
pre.next = current.next
break
elif current.next is None:
print('找不到要删除的数据')
break
else:
pre = current
current = current.next
def travel(self):
'''遍历返回链表数据'''
if not self.is_empty():
current = self.head
link = ""
while current.next:
link += str(current.value)+" "
current = current.next
link += str(current.value)
return link
def reversal(self):
'''反转链表'''
if self.is_empty():
print('链表为空')
return False
else:
head = self.head
new_link = None
while head is not None:
next = head.next
head.next = new_link
new_link = head
head = next
self.head = new_link
def has_cycle(self):
"""是否有环的存在"""
slow, fast = self.head, self.head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
if __name__ == '__main__':
list = SingleLink()
print("\n——————当前链表是否为空:", list.is_empty())
message = ''
while message != 'q':
print('''
************************************************************************************************************
**********************************************请选择相应的序号完成相应的操作*************************************
************************************************************************************************************
** q、退出操作!!!!!! ***
** 1、从头部插入值! ***
** 2、从尾部插入值! ***
** 3、在指定数据后插入值! ***
** 4、删除操作! ***
** 5、反转链表! ***
************************************************************************************************************
''')
message = input('——————输入下一步要进行的相应操作序号——————:')
if message == 'q':
break
print("——————操作前链表数据:", list.travel())
if message == '1':
value = input('——————请输入要插入的数据:')
list.add(value)
elif message == '2':
value = input('——————请输入要插入的数据:')
list.append(value)
elif message == '3':
data = input('——————请输入指定数据值:')
value = input('——————请输入要插入的数据:')
list.insert(data, value)
elif message == '4':
value = input('——————请输入要删除的数据:')
list.remove(value)
elif message == '5':
list.reversal()
elif message == '6':
print("——————操作前链表数据:", list.find_cycle_middle_node())
print("——————操作后链表数据:", list.travel())
代码运行截图:
Python单链表优化第二版:
1、从头部插入值!
2、从尾部插入值!
3、在指定index下标插入值!
4、获取指定index下标的节点值!
5、删除指定index下标节点!
class Node(object):
def __init__(self, val=None, next=None):
self.val = val
self.next = next
class SingleLink(object):
def __init__(self):
self.head = Node()
self.size = 0
def get(self, index):
"""获取节点"""
index = int(index)
if index < 0 or index >= self.size:
print('——————超出链表节点范围')
return False
current = self.head
for i in range(index+1):
current = current.next
print('——————获取到数据:',current.val)
def add(self, val):
'''从头部开始添加节点'''
self.add_at_index(0, val)
def append(self, val):
'''链表尾部追加节点'''
self.add_at_index(self.size, val)
def add_at_index(self, index, val):
'''根据下标index位置添加节点数据'''
index = int(index)
if index < 0 or index > self.size:
print('——————超出链表节点范围')
return False
self.size += 1
pre = self.head
for _ in range(index):
pre = pre.next
new_node = Node(val)
new_node.next = pre.next
pre.next = new_node
def remove_at_index(self, index):
'''根据下标index位置删除节点数据'''
index = int(index)
if index >= self.size:
return False
if index < 0:
index = 0
self.size -= 1
pred = self.head
for _ in range(index):
pred = pred.next
# 删除节点
pred.next = pred.next.next
def travel(self):
if self.size > 0:
current = self.head.next
length = ""
while current.next:
length += str(current.val)+" "
current = current.next
length += str(current.val)
return length
def reversal(self):
'''反转链表'''
if self.size == 0:
print('链表为空')
return False
else:
current = self.head
pre = None
while current is not None:
next = current.next
current.next = pre
pre = current
current = next
self.head = pre
if __name__ == '__main__':
list = SingleLink()
message = ''
while message != 'q':
print('''
************************************************************************************************************
**********************************************请选择相应的序号完成相应的操作*************************************
************************************************************************************************************
** q、退出操作!!!!!! ***
** 1、从头部插入值! ***
** 2、从尾部插入值! ***
** 3、在指定index下标后插入值! ***
** 4、获取指定index下标的值! ***
** 5、删除指定index下标节点! ***
*************************************************************************************************************
''')
message = input('——————输入下一步要进行的相应操作序号——————:')
if message == 'q':
break
print("——————操作前链表数据:", list.travel())
if message == '1':
value = input('——————从头部插入值:')
list.add(value)
elif message == '2':
value = input('——————从尾部插入值:')
list.append(value)
elif message == '3':
data = input('——————请输入指定下标index:')
value = input('——————请输入要插入的数据:')
list.add_at_index(data, value)
elif message == '4':
value = input('——————请输入要获取的数据下标index:')
list.get(value)
elif message == '5':
value = input('——————请输入要删除的下标index:')
list.remove_at_index(value)
print("——————操作后链表数据:", list.travel())
最后上一张单链表基本操作图,有兴趣的朋友可以看看: