# -*- coding=utf-8 -*-
# software: 算法学习
# datetime:2020/4/9 9:14 上午
class Node(object):
"""
链表的节点对象:包含数据与和指针域
"""
def __init__(self, data=None, next=None):
self._value = data
self._next = next
def get_value(self):
return self._value
def get_next(self):
return self._next
def set_value(self, new_data):
self._value = new_data
def set_next(self, new_next):
self._next = new_next
class CycleLinkList(object):
def __init__(self):
# 声明一个尾节点
self._tail = Node()
self._tail.set_next(self._tail)
self._length = 0
def head(self):
"""
链表的第一个元素(除去头节点)
:return:
"""
return self._tail.get_next()
def tail(self):
"""
链表的最后一个元素
:return:
"""
return self._tail
def is_empty(self):
"""
判断链表是否为空
:return:
"""
return self._tail.get_next() == self._tail
def size(self):
"""
链表的大小
:return:
"""
return self._length
def add(self, value):
"""
从头部插入节点
:param value:
:return:
"""
new_node = Node()
new_node.set_value(value)
new_node.set_next(self._tail.get_next())
self._tail.set_next(new_node)
self._length += 1
def append(self, value):
"""
从尾部追加节点
:param value:
:return:
"""
new_node = Node()
new_node.set_value(value)
new_node.set_next(self._tail)
head = self._tail.get_next()
tmp = head
while head != self._tail:
tmp = head
head = head.get_next()
tmp.set_next(new_node)
self._length += 1
def search(self, value):
"""
查找数据,返回-1或者节点索引
:param value:
:return:
"""
current = self._tail.get_next()
count = 0
while current != self._tail:
if current.get_value() == value:
return count
current = current.get_next()
count += 1
else:
return -1
def remove(self, value):
"""
删除 返回该数据或者-1
:param value:
:return:
"""
current = self._tail.get_next()
tmp = self._tail
while current != self._tail:
if current.get_value() == value:
tmp.set_next(current.get_next())
self._length -= 1
return current.get_value()
tmp = current
current = current.get_next()
else:
return -1
def insert(self, index, value):
"""
插入数据节点
:param index:
:param value:
:return:
"""
if index < 0:
return -1
new_node = Node()
new_node.set_value(value)
current = self._tail.get_next()
tmp = self._tail
count = 0
while current != self._tail:
if count == index:
tmp.set_next(new_node)
new_node.set_next(current)
self._length += 1
return value
count += 1
tmp = current
current = current.get_next()
else:
tmp.set_next(new_node)
new_node.set_next(current)
self._length += 1
if __name__ == '__main__':
arr = [1, 4, 2, 6, 9, 12, 54, 3]
cycle_list = CycleLinkList()
for i in arr:
cycle_list.append(i)
current = cycle_list.tail().get_next()
tmp = cycle_list.tail()
l = ""
while current.get_next() != tmp:
l += str(current.get_value()) + " "
current = current.get_next()
l += str(current.get_value())
print("初始化遍历链表的值", l)
print("初始化链表长度", cycle_list.size())
print("删除数据:", cycle_list.remove(4))
print("插入数据", cycle_list.insert(1, 10))
print("当前链表长度", cycle_list.size())
print("查找数据:%s, 结果:%s" % (13, cycle_list.search(13)))
current = cycle_list.tail().get_next()
tmp = cycle_list.tail()
l = ""
while current.get_next() != tmp:
l += str(current.get_value()) + " "
current = current.get_next()
l += str(current.get_value())
print("当前遍历链表的值", l)
循环单链表 python
最新推荐文章于 2024-04-12 12:15:46 发布