您的位置:首页 > 理论基础 > 数据结构算法

python实现数据结构(三)——单向循环链表实现

2018-08-17 16:35 681 查看

单向循环链表的结构

单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。

代码实现

# 如果要直接使用可以使用deque创建队列(也就是链表)

# 2 节点实现
class Node(object):
"""单链表的结点"""

def __init__(self, item):
# item存放数据元素
self.item = item
# next是下一个节点的标识
self.next = None

# 链表实现
class SinCycLinkedlist(object):
"""单向链表实现"""

def __init__(self):
"""每个链表都有一个头"""
self.__head = None

def is_empty(self):
"""判断列表是否为空"""
return self.__head == None

def length(self):
"""获取链表长度"""
if self.is_empty():
return 0
count = 1
cur = self.__head
while cur.next != self.__head:  # 只要链表块的指向不指向头部,就一直count+1
count += 1
cur = cur.next
return count

def travel(self):
"""遍历列表"""
if self.is_empty():
return
cur = self.__head
while cur.next != self.__head:
print(cur.item)
cur = cur.next
print("")

def add(self, item):
"""头部增加元素"""
node = Node(item)
if self.is_empty():
self.__head = node
node.next = self.__head
else:
node.next = self.__head
cur = self.__head
# 移动到链表尾部,将尾部的next链接到新增元素
while cur.next != self.__head:
cur = cur.next
cur.next = node
self.__head = node

def append(self, item):
"""尾部添加元素"""
node = Node(item)
# 如果链表为空,将链表头指向node
if self.is_empty():
self.__head = node
node.next = self.__head
# 不为空的情况下,找到最后一个节点,将他的next链接到node
else:
cur = self.__head
while cur.next != self.__head:
cur = cur.next
cur.next = node
node.next = self.__head

def insert(self, pos, item):
"""指定位置添加元素"""
if pos <= 0:
self.add(item)
elif pos > (self.length() - 1):
self.append(item)
else:
node = Node(item)
count = 0
pre = self.__head
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:
if cur.item == 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:  # 中间节点
# 将删除节点的前一个节点的next指向删除节点的下一个节点
pre.next = cur.next
return
else:
pre = cur
cur = cur.next

if cur.item == item:
if cur == self.__head:
# 链表只有一个节点
self.__head = None
else:
# pre.next = cur.next
pre.next = self.__head

def search(self, item):
"""查找节点是否存在"""
if self.is_empty():
return False
cur = self.__head
if cur.item == item:
return True
while cur.next != self.__head:
cur = cur.next
if cur.item == item:
return True

return False

效果演示:

if __name__ == '__main__':
ll = SinCycLinkedlist()
ll.add(1)
ll.add(2)
ll.append(3)
ll.insert(2, 4)
ll.insert(4, 5)
ll.insert(0, 6)
print("length:", ll.length())
ll.travel()
print(ll.search(3))
print(ll.search(7))
ll.remove(1)
print("length:", ll.length())
ll.travel()
length: 6
6
2
1
4
3

True
False
length: 5
6
2
4
3
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: