##################### P4.9-P4.12 循环链表 ###########################
#coding:utf-8
class Node(object):
def __init__(self,elem):
self.elem = elem
self.next = None
class SinglecycleList(object):
"""SinglelinkList"""
def __init__(self,node = None):
#默认参数
self.__head = node
if node:
node.next= node
def is_empty(self):
return self.__head == None
def travel(self):
"""遍历链表"""
if self.is_empty():
return True
cur = self.__head
while cur.next != self.__head:
# print(cur.elem, end=" ")
cur= cur.next
print(cur.elem)
# print("")
def length(self):
"""length of list 遍历 借助 Cursor 指针或者游标计数"""
if self.is_empty():
return 0
cur = self.__head#cur游标 遍历节点 不断移动
count = 1
while cur!= self.__head:# cur.next = None
count+=1
cur = cur.next
return count
def __add__(self, item):
"""nedd to add node"""
node = Node(item)
cur = self.__head
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 append(self,item):
node = Node(item) #node 实例化
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 pos 从0 开始 """
pre = self.__head
count = 0
if pos<0:
self.__add__(item)
elif pos>(self.length()-1):
self.append(item)
else:
while (count
count+=1
pre = pre.next
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!= self.__head:
if cur.elem == item:#循环中找到要删除的节点
if cur == self.__head:#判断是否是头节点
rear = self.__head #找到尾节点
while rear.next != self.__head:
rear = rear.next
rear.next=self.__head
self.__head = cur.next
else:#中间删除
pre.next = cur.next
return
else:
pre = cur
cur = cur.next
#退出循环,cur指向尾节点
if cur.elem ==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
while cur!= self.__head:
if cur.elem == item:
return True
else:
cur = cur.next
if cur.elem ==item:
return True
return False
# single_obe = SinglelinkList()
if __name__ =="__main__":
ll = SinglecycleList()
print(ll.is_empty())
print(ll.length())
ll.append(1)
print(ll.is_empty())
print(ll.length())
ll.append(2)
ll.__add__(8)
ll.append(3)
ll.append(4)
ll.append(5)
ll.append(6)
ll.insert(-1, 9)
ll.insert(3, 100)
ll.insert(8, 1234)
ll.travel()
### 9 8 1 3 119 1 3 1234
ll.remove(1234)
ll.travel()