前言
博主最近在复习算法与数据结构,由于平时主力语言是Python,所以找了个用Python讲解数据结构的视频看了下,链接为:https://www.bilibili.com/video/av20982396?p=1。
关于链表,视频里讲的很清楚,但是代码有几处小错误,现将其代码纠正,并添加视频里没有讲到的双循环链表代码。
那么我们直接上代码吧。
单链表
class Node(object):
"""单链表结点"""
def __init__(self, elem):
self.elem = elem
self.next = None
class SinglyLinkedList(object):
def __init__(self, node=None):
self.__head = node
def is_empty(self):
"""判断链表是否为空"""
return self.__head is None
def length(self):
"""返回链表长度"""
cur = self.__head
count = 0
while cur is not None:
count += 1
cur = cur.next
return count
def travel(self):
"""遍历链表"""
cur = self.__head
while cur is not None:
print(cur.elem, end=' ')
cur = cur.next
print()
def add(self, elem):
"""向链表头部添加元素"""
node = Node(elem)
node.next = self.__head
self.__head = node
def append(self, elem):
"""向链表尾部添加元素"""
node = Node(elem)
if self.is_empty():
self.__head = node
else:
cur = self.__head
while cur.next is not None:
cur = cur.next
cur.next = node
def insert(self, pos, elem):
"""向链表位置pos处插入元素
Args:
pos: 插入位置,从0开始计数
elem: 需要插入的元素
"""
if pos <= 0:
self.add(elem)
elif pos > (self.length() - 1):
self.append(elem)
else:
pre = self.__head
count = 0
while count < (pos-1):
count += 1
pre = pre.next
# 当循环退出后,pre指向pos-1位置
node = Node(elem)
node.next = pre.next
pre.next = node
def remove(self, elem):
"""从链表中删除第一个值为elem的元素"""
cur = self.__head
pre = None
while cur is not None:
if cur.elem == elem:
if cur == self.__head:
self.__head = cur.next
else:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
def search(self, elem):
"""查找链表中是否存在元素elem"""
cur = self.__head
while cur is not None:
if cur.elem == elem:
return True
else:
cur = cur.next
return False
if __name__ == '__main__':
singly_linked_list = SinglyLinkedList()
print(singly_linked_list.is_empty())
print(singly_linked_list.length())
print('===================')
singly_linked_list.append(1)
print(singly_linked_list.is_empty())
print(singly_linked_list.length())
print('===================')
singly_linked_list.append(2)
singly_linked_list.append(3)
singly_linked_list.add(7)
singly_linked_list.append(4)
singly_linked_list.append(5)
singly_linked_list.insert(0, 13) # 13, 7, 1, 2, 3, 4, 5
singly_linked_list.travel()
singly_linked_list.insert(2, 99) # 13, 7, 99, 1, 2, 3, 4, 5
singly_linked_list.travel()
singly_linked_list.insert(11, 22) # 13, 7, 99, 1, 2, 3, 4, 5, 22
singly_linked_list.travel()
singly_linked_list.remove(13)
singly_linked_list.travel() # 7 99 1 2 3 4 5 22
singly_linked_list.remove(22)
singly_linked_list.travel() # 7 99 1 2 3 4 5
singly_linked_list.remove(3)
singly_linked_list.travel() # 7 99 1 2 4 5
print(singly_linked_list.search(1000)) # False
print(singly_linked_list.search(7)) # True
print(singly_linked_list.search(5)) # True
print(singly_linked_list.search(2)) # True
如上所示,测试代码已经在main函数中给出了。
单循环链表
class Node(object):
def __init__(self, elem):
"""单循环链表结点"""
self.elem = elem
self.next = None
class SinglyLinkedCircularList(object):
"""单向循环链表"""
def __init__(self, node=None):
self.__head = node
if node:
node.next = node
def is_empty(self):
"""判断链表是否为空"""
return self.__head is None
def length(self):
"""求链表长度"""
if self.is_empty():
return 0
cur = self.__head
count = 1 # 下方循环退出时,链表至少有一个结点
while cur.next != self.__head:
count += 1
cur = cur.next
return count
def travel(self):
"""遍历链表"""
if self.is_empty():
return
cur = self