数据结构与算法(python版)(五)
1、单向循环链表
链表的最后一个节点的next域不再为None,而是指向链表的头节点
2、单向循环链表的操作
① is_empty() 链表是否为空
② length() 链表长度
③ travel() 遍历链表
④ add(item) 头部添加元素
⑤ append(item) 尾部添加元素
⑥ insert(pos, item) 指定位置添加元素
⑦ remove(item) 删除节点
⑧ search(item) 查找节点是否存在
3、单向循环链表代码实现
class Node(object):
#节点
def __init__(self, elem):
self.elem = elem
self.next = None
class SingleLinkList(object):
#单向循环链表
def __init__(self, node = None):
self.__head = node
#传入单个节点,要设置自身循环
if node:
node.next = node
def is_empty(self):
#链表是否为空
return self.__head == None
def length(self):
#链表长度
if self.is_empty():
return 0
cur = self.__head #设置游标
count = 1 #因为cur.next != 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.__head #如果是空链表,后续代码无法执行,故先用if过滤
while cur.next != self.__head:
print(cur.elem, end = ' ')
cur = cur.next
#cur指向最后一个节点,不再进入循环,故最后一个节点不能打印
print(cur.elem)
print(' ')
def append(self, item):
#尾插法
node = Node(item)
if self.is_empty(): #判空
self.__head = node
node.next = node
else: #若不为空,则将游标移至最后一节点
cur = self.__head
while cur.next != self.__head:
cur = cur.next
node.next = self.__head
cur.next = node
def add(self, item):
#头部插入元素
#遍历一次,将游标指到尾部,再指向插入节点
node = Node(item)
if self.is_empty():
self.__head = node
node.next = node
else:
cur = self.__head
while cur.next != self.__head:
cur = cur.next
#退出循环,cur指向尾结点
node.next = self.__head
self.__head = node
cur.next = node
def insert(self, pos, item):
#指定位置插入元素
#游标移动到(pos-1)位置
node = Node(item)
if pos <= 0:
self.add(item)
elif pos > (self.length()-1):
self.append(item)
else:
pre = self.__head
count = 0
while count < (pos - 1):
count += 1
pre = pre.next
node.next = pre.next
pre.next = node
def remove(self, item):
#删除节点
#设置一前一后两个游标
if self.is_empty():
return
cur = self.__head
pre = None
#开始遍历
while cur.next != self.__head:
#cur没到尾结点
if cur.elem == item: #cur的元素与要删除元素一致
#判断是否为头节点
if cur == self.__head:
#要删除的元素是头节点时
rear = self.__head
while rear.next != self.__head:
rear = rear.next
#退出循环,找到尾结点
#操作self.__head和rear指向
self.__head = cur.next
rear.next = self.__head
else:
#中间节点
pre.next = cur.next
return
else:
pre = cur
cur = cur.next
#退出循环,cur指向尾结点,判断尾结点是否是要找元素
if cur.elem == item:
#判断链表是否只有一个节点
if cur == self.__head:
self.__head = None
else:
pre.next = cur.next
def search(self, item):
#查找节点是否存在
cur = self__head
if self.is__empty():
return False
cur = self.__head
while cur.next != self.__head:
if cur.elem == item:
return True
else:
cur = cur.next
#退出循环,cur指向尾结点但是没有比较
if cur.elem == item:
return True
return False
if __name__ == '__main__':
ll = SingleLinkList()
print(ll.is_empty())
ll.append(1)
ll.append(2)
ll.append(3)
ll.append(4)
ll.add(8)
ll.insert(2, 5)
ll.insert(-1, 55)
ll.insert(10, 65)
ll.travel()
ll.remove(4)
ll.travel()
ll.remove(55)
ll.travel()
ll.remove(65)
ll.travel()