python遍历链表_Python 单向循环链表

classNode(object):"""节点"""

def __init__(self, item):

self.item=item

self.next=NoneclassSinCycLinkedlist(object):"""单向循环链表"""

def __init__(self):

self._head=Nonedefis_empty(self):"""判断链表是否为空"""

return self._head ==Nonedeflength(self):"""返回链表的长度"""

#如果链表为空,返回长度0

ifself.is_empty():return0

count= 1cur=self._headwhile cur.next !=self._head:

count+= 1cur=cur.nextreturncountdeftravel(self):"""遍历链表"""

ifself.is_empty():returncur=self._headprintcur.item,while cur.next !=self._head:

cur=cur.nextprintcur.item,print ""

defadd(self, item):"""头部添加节点"""node=Node(item)ifself.is_empty():

self._head=node

node.next=self._headelse:#添加的节点指向_head

node.next =self._head#移到链表尾部,将尾部节点的next指向node

cur =self._headwhile cur.next !=self._head:

cur=cur.next

cur.next=node#_head指向添加node的

self._head =nodedefappend(self, item):"""尾部添加节点"""node=Node(item)ifself.is_empty():

self._head=node

node.next=self._headelse:#移到链表尾部

cur =self._headwhile cur.next !=self._head:

cur=cur.next#将尾节点指向node

cur.next =node#将node指向头节点_head

node.next =self._headdefinsert(self, pos, item):"""在指定位置添加节点"""

if pos <=0:

self.add(item)elif pos > (self.length()-1):

self.append(item)else:

node=Node(item)

cur=self._head

count=0#移动到指定位置的前一个位置

while count < (pos-1):

count+= 1cur=cur.next

node.next=cur.next

cur.next=nodedefremove(self, item):"""删除一个节点"""

#若链表为空,则直接返回

ifself.is_empty():return

#将cur指向头节点

cur =self._head

pre=None#若头节点的元素就是要查找的元素item

if cur.item ==item:#如果链表不止一个节点

if cur.next !=self._head:#先找到尾节点,将尾节点的next指向第二个节点

while cur.next !=self._head:

cur=cur.next#cur指向了尾节点

cur.next =self._head.next

self._head=self._head.nextelse:#链表只有一个节点

self._head =Noneelse:

pre=self._head#第一个节点不是要删除的

while cur.next !=self._head:#找到了要删除的元素

if cur.item ==item:#删除

pre.next =cur.nextreturn

else:

pre=cur

cur=cur.next#cur 指向尾节点

if cur.item ==item:#尾部删除

pre.next =cur.nextdefsearch(self, item):"""查找节点是否存在"""

ifself.is_empty():returnFalse

cur=self._headif cur.item ==item:returnTruewhile cur.next !=self._head:

cur=cur.nextif cur.item ==item:returnTruereturnFalseif __name__ == "__main__":

ll=SinCycLinkedlist()

ll.add(1)

ll.add(2)

ll.append(3)

ll.insert(2, 4)

ll.insert(4, 5)

ll.insert(0,6)print "length:",ll.length()

ll.travel()print ll.search(3)print ll.search(7)

ll.remove(1)print "length:",ll.length()

ll.travel()

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

余额充值