单向循环链表
Posted fenglivoong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单向循环链表相关的知识,希望对你有一定的参考价值。
单向循环链表:
单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
操作:
- is_empty() 判断链表是否为空
- length() 返回链表的长度
- travel() 遍历
- add(item) 在头部添加一个节点
- append(item) 在尾部添加一个节点
- insert(pos, item) 在指定位置pos添加节点
- remove(item) 删除一个节点
- search(item) 查找节点是否存在
class Node(object): """定义节点这个类""" def __init__(self,elem): self.elem = elem #创建这个类的对象时就可以给他传入要保存的数据 self.next = None #刚开始不知道指向谁,所以置为空 #node = Node(100) class Singlecyclelinklist(object): """定义单链表,这个类里要实现单链表的各种操作,如链表长度,往链表添加元素等""" def __init__(self,node=None): self._head = node #保存头结点,私有属性 if node: node.next = node #如果node不是空的,也就是给链表传了个节点,就让这个节点指向他自己 def is_empty(self): """链表是否为空""" return self._head == None #返回的是True or False!空链表就返回Ture, return self._head返回None or self._head的地址 def length(self): """链表长度""" cur = self._head #游标,用来移动遍历节点,刚开始让他等于head也就是和head指向同一个地址 if self.is_empty(): return 0 count = 1 #记录数量 # while cur !=None: #遍历的条件就不能是None了 while cur.next != self._head: cur = cur.next count += 1 return count def travel(self): """遍历整个链表""" cur = self._head while cur.next != self._head: #print(self.elem) 错辽,这里的self指的是sll呀 print(cur.elem,end=" ") #打印在同一行end="",在Python2中逗号就行了 cur = cur.next #退出循环,cur指向尾节点,但尾节点的元素没打印 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 #退出循环,cur指向尾节点 node.next = self._head self.head = node cur.next = node def append(self,item): """链表尾部添加元素""" node = Node(item) #if self.is_empty(): #相当于if self_head == None if self._head == None: 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 #insert这部分代码不需要改,中间插的话不涉及位节点的指向问题也就和单链表插入一样了 def insert(self,pos,item): """指定位置添加元素""" node = Node(item) if pos <= 0: self.add(item) elif pos > (self.length()-1): self.append(item) else: 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 = self._head pre = None while cur.next != self._head: #找到要删的节点了就删,没找到的话游标就接着移动 if cur.elem == item: #找到的要删的节点 if cur == self._head: #要删头结点要找到尾节点,让尾节点指向头结点后的节点 #删头结点的情况 rear = self._head while rear.next != self._head: rear = rear.next self._head = cur.next rear.next = self._head 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 def search(self,item): """查看节点是否存在""" if self.is_empty(): return False else: cur = self._head while cur.next != self._head: if cur.elem == item: return True else: cur = cur.next #退出循环,cur指向尾节点,不能把尾节点丢了 if cur.elem == item: return True return False #测试 if __name__ == "__main__": #只在当前文件下运行时执行 sll = Singlecyclelinklist() print(sll.is_empty()) print("什么都不添加时的长度:",end=" ") print(sll.length()) #0 sll.append(1) print(sll.is_empty()) #非空,打印的是self._head print("添加了1时的长度:",end=" ") print(sll.length()) #1 sll.append(2) sll.append(3) sll.append(4) sll.append(5) sll.append(6) sll.travel() #1 2 3 4 5 6 sll.add(10) #10 1 2 3 4 5 6 sll.travel() sll.insert(3,100) #10 1 2 100 3 4 5 6 sll.insert(10,1000) #10 1 2 100 3 4 5 6 sll.travel() print("删头结点") sll.remove(10) #删头结点 #1 2 100 3 4 5 6 sll.travel() #print("开始遍历所有元素:") #sll.travel() print("length:",sll.length()) print(sll.search(6)) #查一下6在不在链表里
以上是关于单向循环链表的主要内容,如果未能解决你的问题,请参考以下文章