python模拟实现链表_Python手写模拟单向链表对象,栈对象和树

单向链表:class error(Exception):

def __init__(self,msg):

super(error,self).__init__()

self.msg=msg

def __str__(self):

return self.msg

class Node:

def __init__(self,ele):

self.ele=ele

self.next=None

class mylist:

def __init__(self,ele=None):

self.index=0

self.pos=0

if ele:

self._head=Node(ele)

else:

self._head = None

def __iter__(self):

return self

def __next__(self):

if self.pos < self.length():

self.pos += 1

cursor = self._head

current=cursor

num = 0

while cursor != None:

current = cursor

cursor = cursor.next

num += 1

if num == self.pos:

return current.ele

else:

raise StopIteration

def empty(self):

return self._head==None

def add(self,item):

node=Node(item)

node.next=self._head

self._head=node

def length(self):

cur=self._head

num=0

if cur:

num+=1

while cur.next:

cur=cur.next

num+=1

return num

else:

return num

def append(self,item):

node=Node(item)

cursor=self._head

if self.empty():

self._head = node

else:

while cursor.next!= None:

cursor = cursor.next

cursor.next=node

def pop(self):

if self.empty():

return None

else:

if self.length()==1:

ele=self._head.ele

self._head.ele=None

return ele

else:

cur=self._head

current=cur

while cur.next!=None:

current=cur

cur=cur.next

ele=cur.ele

current.next=None

return ele

def insert(self,index,item):

if index<0 or index>self.length():

raise error("out of range")

else:

if index==0:

self.add(item)

elif index==self.length():

self.append(item)

else:

node = Node(item)

cur=self._head

pre=0

while pre

cur=cur.next

pre+=1

node.next=cur.next

cur.next=node

def get(self,index):

if index<0 or index>self.length()-1:

raise error("out of range")

else:

num=0

cur=self._head

while num

cur=cur.next

num+=1

return cur.ele

def remove(self,item):

cur=self._head

pre=None

while cur!=None:

if cur.ele==item:

if pre==None:

self._head=cur.next

else:

pre.next=cur.next

break

else:

pre=cur

cur=cur.next

def delete(self,index):

if index<0 or index>self.length()-1:

raise error("out of range")

else:

if index==0:

self._head=self._head.next

else:

num=1

current=self._head

cur=current.next

while num!=index:

current=cur

cur=current.next

num+=1

current.next=cur.next

cur.ele=None

cur.next=None

栈:class stack:

def __init__(self):

self._box=[]

def empty(self):

return self._box==[]

def length(self):

return len(self._box)

def push(self,item):

self._box.append(item)

def pop(self):

return self._box.pop()

树:class Node:

def __init__(self,ele=None,left=None,right=None):

self.ele = ele

self.left = None

self.right = None

class Tree:

def __init__(self,node=None):

self.root = node

def append(self,item):

node = Node(item)

if self.root is None:

self.root = node

else:

queue = [self.root]

while queue:

current=queue.pop(0)

if current.left is None:

current.left = node

return

elif current.right is None:

current.right = node

return

else:

queue.append(current.left)

queue.append(current.right)

def loop(self):

if self.root is None:

return

queue=[self.root]#广度优先

while queue:

current=queue.pop(0)

print(current.ele)

if current.left!=None:

queue.append(current.left)

elif current.right!=None:

queue.append(current.right)

def deep_loop_top(self,node):

if node==None:

return

print(node.ele)

self.deep_loop_top(node.left)

self.deep_loop_top(node.right)

def deep_loop_left(self,node):

if node==None:

return

self.deep_loop_left(node.left)

print(node.ele)

self.deep_loop_left(node.right)

def deep_loop_last(self,node):

if node==None:

return

self.deep_loop_last(node.left)

self.deep_loop_last(node.right)

print(node.ele)

  • 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、付费专栏及课程。

余额充值