单向循环链表
单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
操作
- is_empty() 判断链表是否为空
- length() 返回链表的长度
- travel() 遍历
- add(item) 在头部添加一个节点
- append(item) 在尾部添加一个节点
- insert(pos, item) 在指定位置pos添加节点
- remove(item) 删除一个节点
- search(item) 查找节点是否存在
实现
class Node(): """节点""" def __init__(self,elem): self.elem=elem self.next=None class Single_CYCLE_LinkList(): """单向循环链表""" def __init__(self,node=None): self._head=node if node: node.next=node def is_empty(self): #链表是否为空 if self._head==None: return True else: return False def length(self): #链表长度 if self.is_empty(): return 0 cur=self._head count=1 while cur.next!=self._head: count+=1 cur=cur.next return count def travel(self): #遍历整个链表 if self.is_empty(): return else: cur=self._head while cur.next!=self._head: print(cur.elem,end=' ') cur=cur.next print(cur.elem) def add(self,item): node=Node(item) 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 self._head=node cur.next=node def append(self,item): node=Node(item) if self._head == None: self._head = node node.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(): self.append(item) else: node=Node(item) pre=self._head count=0 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指向头节点 pre=None cur=self._head while cur.next !=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 self.length()==1: self._head=None else: pre.next = cur.next def search(self,item): if self.is_empty(): return False cur=self._head while cur.next!=self._head: if cur.elem==item: return True else: cur=cur.next if cur.elem==item: return True return False if __name__ == '__main__': single_obj=Single_CYCLE_LinkList() print(single_obj.is_empty()) print(single_obj.length()) single_obj.append(1) single_obj.append(2) single_obj.append(3) single_obj.append(4) single_obj.append(5) single_obj.travel() single_obj.add(-1) single_obj.travel() single_obj.insert(-1,-2) single_obj.travel() single_obj.insert(2,0) single_obj.travel() print(single_obj.search(0)) single_obj.remove(2) single_obj.travel() single_obj.remove(5) single_obj.travel() single_obj.remove(-2) single_obj.travel()
0 1 2 3 4 5 -1 1 2 3 4 5 -2 -1 1 2 3 4 5 -2 -1 0 1 2 3 4 5 True -2 -1 0 1 3 4 5 -2 -1 0 1 3 4 -1 0 1 3 4 -2