一、单向循环链表的引入
单向循环链表的结构
链表中的每一个节点都包括数据域和链接域两部分。数据域中存放真实的数据,链接域存放下一个数据的地址,且尾节点的链接域为首节点。
二、单向循环链表的操作
2.1 节点的实现
链表中的每一个数据都由数据区和链接域两部分组成,在Python或者其他语言中没有一个数据类型可以同时储存这两个数据,因此我们可以定义节点这样一个类,而节点中的数据和链接区可以想象成该类的两个属性。
由于链表中的链接域存储的是下一个数据的地址,但在内存中并没有地址这一个明确的数据,因此我们可以将链接域的值设置为下一个节点。
class Node(object):
"""单向循环链表的节点"""
def __init__(self,item,):
#item存放的数据区域
self.item = item
#next存放下一个节点的标识
self.next = None
2.2 单向循环链表的操作
is_empty() 链表是否为空
length() 链表长度
travel() 遍历整个链表
append(item) 链表尾部添加元素
add(item) 链表头部添加元素
insert(pos, item) 指定位置添加元素
search(item) 查找节点是否存在
remove(item) 删除节点
2.3 单链表的操作实现
定义一个单向循环链表类,且进行初始化操作
在进行初始化操作时,需要考虑两种情况:
1.链表为空时,令self.__head = None
2.链表不为空时,首节点指向该节点,该节点的链接域指向该节点
self.__head = node, node.next = node
class SingCycLinkList(object):
def __init__(self,node = None):
#空链表
self.__head = None
if node:
# 首节点指向尾节点
self.__head = node
#尾节点指向首节点
node.next = node
2.3.1 判断单向循环链表是否为空
如果单向循环链表为空,则其首节点为空(self.__head = None);如果单向循环链表不为空,则其首节点不为空(self.__head = node)。
class Node(object):
"""单向循环链表的节点"""
def __init__(self,item):
self.item = item
self.next = None
class SingCycLinkList(object):
def __init__(self,node = None):
#空链表
self.__head = None
if node:
# 首节点指向尾节点
self.__head = node
#尾节点指向首节点
node.next = node
def is_empty(self):
"""单向循环链表是否为空"""
# if self.__head == None:
# return True
# return False
return self.__head == None
node = Node(100)
s = SingCycLinkList(node)
print(s.is_empty())