单向循环链表
单线循环链表
单向循环链表与单向链表的区别就是单向循环链表的尾节点指向了头节点。我们知道,单向链表的尾节点指向None,而单向循环链表指向了头节点,这就是他们之间的区别
单向循环链表的实现
class Node(object):
"""节点"""
def __init__(self, elem):
self.elem = elem
self.next = None
class SingleLinkCycleList(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
while cur.next != self._head:
count += 1
cur = cur.next
return count
def travel(self):
"""遍历整个列表"""
if self.is_empty():
return 0
cur = self._head
while cur.next != self._head:
print(cur.elem, end=" ")
cur = cur.next
print(cur.elem)
print("")
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
node.next = self._head
self._head = node
cur.next = self._head
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 insert(self,pos,item):
"""指定位置添加元素
:param item: 指定增加的具体元素
:param pos 从0开始
"""
if pos <= 0:
self.add(item)
elif pos > self.length()-1:
self.append(item)
else:
pre = self._head
count = 0
while count < pos-1:
pre = pre.next
count += 1
#循环退出后 pre指向pos-1
node = Node(item)
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:
if cur.elem == item:
#判断此节点是否是头节点
if cur == self._head:
rear = self._head
while rear.next != self._head:
rear = rear.next
self._head = cur.next
rear.next = self._head
else:
pre.next = cur.next
return
else:
pre = cur
cur = cur.next
if cur.elem == item:
if cur == self._head:
self._head = None
else:
pre.next = cur.next
def search(self,item):
"""查找节点是否存在"""
if self.is_empty():
return False
cur = self._head
while cur != self._head:
if cur.elem == item:
return True
else:
cur = cur.next
if cur.elem == item:
return True
return False
单向循环链表检查代码:
if __name__ == "__main__":
li = SingleLinkCycleList()
# 检测是否为空
print(li.is_empty())
# 查看链表长度
print(li.length())
# 向链表尾部增加元素
li.append(1)
# 向链表头部增加元素
li.add(3)
li.append(2)
li.append(4)
li.append(5)
print(li.length())
# 遍历链表
li.travel()
# 向指定位置增加元素
li.insert(3, 9)
li.travel()
# 删除元素
li.remove(9)
li.travel()
代码输出效果如下:
True
0
5
3 1 2 4 5
3 1 2 9 4 5
3 1 2 4 5
拜师教育学员文章:作者:2428-于同学,
转载或复制请以 超链接形式 并注明出处 拜师资源博客。
原文地址:《Python学习历程》 发布于2021-12-03
评论 抢沙发