class Node:
def __init__(self, val):
self.elem = val
self.next = None
class SingleCircleChain:
def __init__(self, node: object = None):
self.__head = node
if node:
node.next = node
def is_empty(self):
return self.__head == None
def length(self):
cnt = 0
if self.is_empty():
return cnt
else:
pointer = self.__head
head = id(pointer)
while pointer:
cnt += 1
if id(pointer.next) == head:
break
else:
pointer = pointer.next
return cnt
def append(self, item):
node = Node(item)
if self.is_empty():
self.__head = node
node.next = self.__head
else:
pointer = self.__head
head = id(pointer)
while pointer:
if id(pointer.next) == head:
pointer.next = node
node.next = self.__head
break
else:
pointer = pointer.next
def throughout(self):
if self.is_empty():
print('没有元素')
else:
pointer = self.__head
head = id(pointer)
while pointer:
if id(pointer.next) == head:
print(pointer.elem)
break
else:
print(pointer.elem, end=' ')
pointer = pointer.next
def insert(self, idx: int, val):
node = Node(val)
if self.is_empty():
self.__head = node
node.next = self.__head
else:
n = self.length()
if idx <= 0:
pointer = self.__head
start = pointer
while pointer:
if pointer.next == self.__head:
end = pointer
break
else:
pointer = pointer.next
self.__head = node
node.next = start
end.next = node
elif idx >= n:
self.append(val)
else:
pointer = self.__head
cnt = 0
while pointer:
if cnt == idx - 1:
p = pointer.next
pointer.next = node
node.next = p
break
else:
pointer = pointer.next
cnt += 1
def pop(self, idx=None):
if self.is_empty():
return None
else:
if isinstance(idx,int):
if idx > 0:
cnt = 0
pointer = self.__head
while pointer:
if cnt == idx - 1:
before = pointer
after = pointer.next.next
break
else:
pointer = pointer.next
cnt += 1
before.next = after
else:
pointer = self.__head
start = pointer.next
while pointer:
if pointer.next == self.__head:
self.__head = start
pointer.next = self.__head
break
else:
pointer = pointer.next
else:
pointer = self.__head
head = id(pointer)
while pointer:
if id(pointer.next.next) == head:
pointer.next = self.__head
break
else:
pointer = pointer.next
测试
n1 = Node(1)
scc = SingleCircleChain(node=n1)
print(scc.length())
print('-' * 15)
scc.append(2)
scc.append(3)
print(scc.length())
scc.throughout()
print('-' * 15)
scc.insert(0, 0)
scc.insert(4, 4)
scc.throughout()
print('-' * 15)
scc.insert(2, 10)
scc.throughout()
print('-' * 15)
scc.pop()
scc.throughout()
print('-' * 15)
scc.pop(2)
scc.throughout()
print('-' * 15)
scc.pop(0)
scc.throughout()