python单向循环链表_python---单向循环链表实现

#coding = utf-8

#单向循环链表

classNode:def __init__(self, new_data):#链表有效负载--数据

self.data =new_data#链表指针

self.next =Nonedefget_data(self):returnself.datadefset_data(self, new_data):

self.data=new_datadefget_next(self):returnself.nextdefset_next(self, new_next):

self.next=new_nextclassSingleCycleList:def __init__(self):

self.head=None#作头插入时,需要先判断是否为空列表, 需要要注意插入顺序,

defadd(self, item):#因为实现单链表时,可以统一方式作头插入,所以需要三行代码

#而作双向链表和循环链表时,要区别是否为空链表,所以插入的代码就变化了很多。(简单一行,复杂多行)

node =Node(item)ifself.is_empty():#循环列表,必定首尾相连

self.head =node

node.set_next(self.head)else:#添加的节点指向head

node.set_next(self.head)#移到链表尾部,将尾部节点的next指向node

current =self.headwhile current.get_next() !=self.head:

current=current.get_next()

current.set_next(node)#head指向添加node的

self.head =node#作尾插入时,需要先判断是否为空列表

defappend(self, item):

node=Node(item)ifself.is_empty():#循环列表,必定首尾相连

self.head =node

node.set_next(self.head)else:#移到链表尾部,此处不优美,尾插入,要使用prev,从head往前移动一下!!!!!

current =self.headwhile current.get_next() !=self.head:

current=current.get_next()#将尾节点指向node

current.set_next(node)#将node指向头节点_head

node.set_next(self.head)#指定位置插入节点

definsert(self, pos, item):#相当于头插入

if pos <=0:

self.add(item)#相当于尾插入

elif pos >=self.size():

self.append(item)else:

node=Node(item)

count=0

current=self.head#移动到指定位置的前一个位置

while count < pos - 1:

count+= 1current=current.get_next()#由于不是头尾,直接插入即可

node.set_next(current.get_next())

current.set_next(node)#删除指定节点数据

defremove(self, item):ifself.is_empty():returnprevious=None

current=self.headwhile current.get_next() !=self.head:#待删除节点如果找到

if current.get_data() ==item:#在找到节点之后,需要判断是否为首节点

#因为首节点时,还没有Previous这个变量

if current ==self.head:

rear=self.headwhile rear.get_next() !=self.head:

rear=rear.get_next()

self.head=current.get_next()

rear.set_next(self.head)#待删除节点在中间

else:

previous.set_next(current.get_next())return

#待删除节点如果还没有找到

else:

previous=current

current=current.get_next()#待删除节点在尾部

if current.get_data() ==item:#如果链表中只有一个元素,则此时prior为None,Next属性就会报错

#此时直接使其头部元素为None即可

if current ==self.head:

self.head=Nonereturnprevious.set_next(current.get_next())#查找指定数据是否存在

defsearch(self, item):

current=self.head

found=Falsewhile current.get_next() !=self.head:if current.get_data() ==item:

found=True

current=current.get_next()returnfounddefis_empty(self):return self.head isNonedef __len__(self):returnself.size()defsize(self):ifself.is_empty():return0

count=0

current=self.head#由于是循环单链表,需要一个中断循环的机制

while current.get_next() !=self.head:

count+= 1current=current.get_next()returncountdefshow(self):#因为是循环链表,遍历的方式和非循环的不一样的。

ifself.is_empty():returncurrent=self.headprint(current.get_data(), end=' ')while current.get_next() !=self.head:

current=current.get_next()print(current.get_data(), end=' ')print()if __name__ == '__main__':

s_list=SingleCycleList()print(s_list.is_empty())

s_list.add(5)

s_list.add(4)

s_list.add(76)

s_list.add(23)

s_list.show()

s_list.append(47)

s_list.show()

s_list.insert(0,100)

s_list.show()

s_list.insert(99, 345)

s_list.show()

s_list.insert(3, 222)

s_list.show()

s_list.remove(76)

s_list.show()print(s_list.search(23))

s_list.show()print(s_list.is_empty())print(s_list.size())print(len(s_list))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双向循环链表是一种链式数据结构,每个节点除了存储数据外,还有两个指针,分别指向前驱节点和后继节点。与单向链表相比,双向链表可以支持双向遍历和删除操作。 下面是用 Python 实现双向循环链表的代码: ```python class Node: def __init__(self, data): self.data = data self.prev = None self.next = None class DoublyLinkedList: def __init__(self): self.head = None def is_empty(self): return self.head is None def add_first(self, data): new_node = Node(data) if self.is_empty(): self.head = new_node new_node.prev = new_node new_node.next = new_node else: new_node.next = self.head new_node.prev = self.head.prev self.head.prev.next = new_node self.head.prev = new_node self.head = new_node def add_last(self, data): new_node = Node(data) if self.is_empty(): self.head = new_node new_node.prev = new_node new_node.next = new_node else: new_node.prev = self.head.prev new_node.next = self.head self.head.prev.next = new_node self.head.prev = new_node def remove_first(self): if self.is_empty(): return None elif self.head.next is self.head: data = self.head.data self.head = None return data else: data = self.head.data self.head.next.prev = self.head.prev self.head.prev.next = self.head.next self.head = self.head.next return data def remove_last(self): if self.is_empty(): return None elif self.head.next is self.head: data = self.head.data self.head = None return data else: data = self.head.prev.data self.head.prev.prev.next = self.head self.head.prev = self.head.prev.prev return data def __str__(self): if self.is_empty(): return '[]' else: s = '[' node = self.head while node.next is not self.head: s += str(node.data) + ', ' node = node.next s += str(node.data) + ']' return s ``` 以上是基础的双向循环链表实现,你可以根据自己的需求,添加其他方法和属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值