单向循环链表
单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
单向循环链表的操作和代码实现
单向循环链表的操作和单向链表的一样,只不过末尾节点的next指向了head,进行有些操作时的判断条件发生了改变。
还是和之前一样,我们先进行节点的声明和链表长度,是否为空的代码实现:
class Node(object):
"""节点封装"""
def __init__(self, element):
self.element = element
self.next = None
class LoopSingleLink(object):
"""单向循环链表封装"""
def __init__(self):
self._head = None
def is_empty(self):
return self._head == None
def __len__(self):
if self.is_empty():
return 0
else:
length = 1
cur = self._head
while cur.next != self._head:
length += 1
cur = cur.next
return length
def travel(self):
"""遍历链表"""
if self.is_empty():
print('空链表')
else:
cur = self._head
while cur.next != self._head:
print(cur.element, end=',')
cur = cur.next
print(cur.element, end=',')
头部添加元素
def add(self, item):
"""头部添加元素"""
node = Node(item)
if self.is_empty():
self._head = node
node.next = self._head
else:
# 添加的节点指向_head
node.next = self._head
# 移动到链表末尾,将尾部节点的next指向node
cur = self._head
while cur.next != self._head:
cur = cur.next
cur.next = node
# _head指向node
self._head = node
尾部添加元素
def append(self, item):
"""尾部添加元素"""
node = Node(item)
if self.is_empty():
self._head = node
node.next = self._head
else:
cur = self._head
while cur.next != self._head:
cur = cur.next
# 将尾节点指向node
cur.next = node
# 将添加节点的next指向_head
node.next = self._head
指定位置添加元素
def insert(self, index, item):
"""指定位置添加元素"""
if index <= 0:
self.add(item)
elif index >= self.__len__():
self.append(item)
else:
# 中间位置添加元素
cur = self._head
count = 0
node = Node(item)
while count < index-1:
count += 1
cur = cur.next
node.next = cur.next
cur.next = node
删除指定元素
def remove(self, item):
"""删除指定元素的节点"""
"""
分为三种情况:
1. 删除头部,需要更改_head和尾节点next指向的头部_head
2. 删除尾部,更改尾节点前一个节点的next指向_head
3. 删除中间位置,
"""
cur = self._head
pre = None
while cur.next != self._head:
if cur.element == item:
# 如果是头节点
if not pre:
# 寻找最后一个节点,将next指向新的_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
break
else:
pre = cur
cur = cur.next
查找元素在链表中是否存在
def search(self, item):
"""查找指定元素节点是否存在"""
if self.is_empty():
return False
cur = self._head
# 判断除了最后一个节点是否等于item
while cur.next != self._head:
if cur.element == item:
return True
cur = cur.next
# 判断最后一个节点是否为item
if cur.element == item:
return True
return False
测试代码
if __name__ == '__main__':
link = LoopSingleLink()
# link.add(3)
# print(link.travel())
# link.append(1)
# link.append(2)
# print(link.travel())
print("链表是否为空?", link.is_empty())
print(link.__len__())
# link.insert(1, 'hello')
# print(link.travel())
# link.remove(3)
# print(link.travel())
# print(link.search('hello'))