单项循环链表
单向循环链表
单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。

操作
- is_empty() 判断链表是否为空
- length() 返回链表的长度
- travel() 遍历
- add(item) 在头部添加一个节点
- append(item) 在尾部添加一个节点
- insert(pos, item) 在指定位置pos添加节点
- remove(item) 删除一个节点
- search(item) 查找节点是否存在
1 # ------------节点实现------------ 2 class SingleNode(): 3 """单链表的结点""" 4 def __init__(self,elem): 5 # _item存放数据元素 6 self.elem=elem 7 # _next是下一个节点的标识 8 self.next=None 9 10 11 # ------------单向循环链表------------ 12 class SinCycLinkedlist(): 13 """单向循环链表""" 14 def __init__(self,node=None): 15 self.__head=node 16 if node: 17 node.next=node 18 19 def is_empty(self): 20 """判断链表是否为空""" 21 return self.__head==None 22 23 def length(self): 24 """链表长度""" 25 # cur初始时指向头节点 26 if self.is_empty(): 27 return 0 28 cur=self.__head 29 count=1 30 # 尾节点指向None,当未到达尾部时 31 while cur.next!=self.__head: 32 count+=1 33 # 将cur后移一个节点 34 cur=cur.next 35 return count 36 37 def travle(self): 38 """遍历链表""" 39 if self.is_empty(): 40 return None 41 cur=self.__head 42 while cur.next!=self.__head: 43 print(cur.elem,end=' ') 44 cur=cur.next 45 print(cur.elem) 46 # print('') 47 48 def add(self,item): 49 """头部添加元素---头插法""" 50 node=SingleNode(item) 51 if self.is_empty(): 52 self.__head=node 53 node.next=node 54 else: 55 cur=self.__head 56 # 移到链表尾部,将尾部节点的next指向node 57 while cur.next!=self.__head: 58 cur=cur.next 59 # 添加的节点指向_head 60 node.next=self.__head 61 self.__head=node 62 # cur.next=node 63 cur.next=self.__head 64 65 def append(self,item): 66 """尾部添加元素---尾插法""" 67 node=SingleNode(item) 68 # 先判断链表是否为空,若是空链表,则将_head指向新节点 69 if self.is_empty(): 70 self.__head=node 71 node.next=node 72 # 若不为空,则找到尾部,将尾节点的next指向新节点 73 else: 74 cur=self.__head 75 # 移到链表尾部 76 while cur.next!=self.__head: 77 cur=cur.next 78 # 将node指向头节点_head 79 node.next=self.__head 80 # 将尾节点指向node 81 cur.next=node 82 83 def insert(self,pos,item): 84 """指定位置添加元素""" 85 # 若指定位置pos为第一个元素之前,则执行头部插入 86 if pos<=0: 87 self.add(item) 88 # 若指定位置超过链表尾部,则执行尾部插入 89 elif pos>(self.length()-1): 90 self.append(item) 91 # 找到指定位置 92 else: 93 node=SingleNode(item) 94 count=0 95 # pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置 96 pre=self.__head 97 while count<(pos-1): 98 count+=1 99 pre=pre.next 100 # 先将新节点node的next指向插入位置的节点 101 node.next=pre.next 102 # 将插入位置的前一个节点的next指向新节点 103 pre.next=node 104 105 def search(self,item): 106 """链表查找节点是否存在,并返回True或者False""" 107 cur=self.__head 108 while cur!=None: 109 if cur.elem==item: 110 return True 111 else: 112 cur=cur.next 113 return False 114 115 def remove(self,item): 116 """删除节点""" 117 if self.is_empty(): 118 return 119 120 cur=self.__head 121 pre=None 122 123 while cur.next!=self.__head: 124 # 找到了指定元素 125 if cur.elem==item: 126 # 先判断此节点是否是头节点 127 if cur==self.__head: 128 # 头节点的情况 129 #找尾节点 130 rear=self.__head 131 while rear.next!=self.__head: 132 rear=rear.next 133 self.__head=cur.next 134 rear.next=self.__head 135 else: 136 # 中间节点 137 pre.next=cur.next 138 return 139 else: 140 # 继续按链表后移节点 141 pre=cur 142 cur=cur.next 143 #退出循环,cur指向尾结点 144 if cur.elem==item: 145 if cur==self.__head: 146 #链表只有一个节点 147 self.__head=None 148 else: 149 pre.next=self.__head 150 151 if __name__ == '__main__': 152 li=SinCycLinkedlist() 153 print(li.is_empty()) 154 print(li.length()) 155 156 li.append(1) 157 li.add(4) 158 li.append(2) 159 li.append(3) 160 # print(li.is_empty()) 161 # print(li.length()) 162 li.travle() 163 li.insert(-1,5) 164 li.travle() 165 li.insert(2,6) 166 li.travle() 167 li.insert(8,7) 168 li.travle() 169 print(li.search(5)) 170 li.remove(5) 171 li.travle() 172 li.remove(1) 173 li.travle() 174 li.remove(20) 175 li.travle()
1 #执行结果 2 True 3 0 4 4 1 2 3 5 5 4 1 2 3 6 5 4 6 1 2 3 7 5 4 6 1 2 3 7 8 True 9 4 6 1 2 3 7 10 4 6 2 3 7 11 4 6 2 3 7
posted on 2019-09-18 20:45 cherry_ning 阅读(141) 评论(0) 收藏 举报
浙公网安备 33010602011771号