单向循环链表
单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
操作
- is_empty() 判断链表是否为空
- length() 返回链表的长度
- travel() 遍历
- add(item) 在头部添加一个节点
- append(item) 在尾部添加一个节点
- insert(pos, item) 在指定位置pos添加节点
- remove(item) 删除一个节点
- search(item) 查找节点是否存在
实现
#coding:utf-8
class SingleNode():
'''节点'''
def __init__(self,item):
self.item = item
self.next = None
class SingleLinkList():
'''单向循环链表'''
def __init__(self,node = None):
self.head = node
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 = count +1
cur = cur.next
return count
def travel(self):
'''遍历链表'''
cur = self.head
if self.is_empty():
return
while cur.next != self.head:
print(cur.item,end=',')
cur = cur.next
print()
def add(self,item):
'''头部添加节点'''
node = SingleNode(item)
if self.is_empty():
self.head = node
node.next = self.head
else:
node.next = self.head
lastNode = self.last_node()
lastNode.next = node
self.head = node
def last_node(self):
''' 获取最后一个节点'''
cur = self.head
while cur.next != self.head:
cur = cur.next
return cur
def append(self,item):
'''尾部添加节点'''
node = SingleNode(item)
if self.is_empty():
self.head = node
self.head.next = self.head
else:
lastNode = self.last_node()
lastNode.next = node
node.next = self.head
def insert(self,pos,item):
'''在指定位置添加节点'''
node = SingleNode(item)
if pos <= 0 or self.head == None:
node.next = self.head
self.head = node
return
cur = self.head
count = 1
while count < pos and count < self.length():
cur = cur.next
count += 1
node.next = cur.next
cur.next = node
def remove(self,item):
'''删除一个节点'''
cur = self.head
if cur == None:
print('链表为空!')
return False
if cur.item == item:
self.head = cur.next
return True
while cur != None:
if cur.next.item == item:
cur.next = cur.next.next
print('-------remove------')
return True
cur = cur.next
def search(self,item):
'''查找节点是否存在'''
count = 0
cur = self.head
while cur != None:
count += 1
if cur.item == item:
print('元素:%s是第%s个'%(item,count))
return True
cur = cur.next
print('无此元素')
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()