python单循环_数据结构学习--单循环链表(python)

概念

将单链表的终端节点的指针由原来的空指针改为指向头节点, 就是整个单链表形成一个环, 这种首尾相接的单链表称为单循环链表.

实现

class Node:

"""

节点

"""

def __init__(self, value):

self.data = value

self.next = None

class CircularLinkedList:

def __init__(self):

self.rear = None # 尾节点

def is_empty(self):

return self.rear is None

# def append(self, elem):

# """

# 尾插法

# """

# temp = Node(elem)

# if self.rear is None:

# temp.next = temp

# self.rear = temp

# else:

# temp.next = self.rear.next

# self.rear.next = temp

# self.rear = temp

def prepend(self, elem):

"""

头插法

"""

temp = Node(elem)

if self.rear is None:

temp.next = temp

self.rear = temp

else:

temp.next = self.rear.next

self.rear.next = temp

def append(self, elem):

"""

尾插法

先将节点插入头部,然后尾指针后移

"""

self.prepend(elem)

self.rear = self.rear.next

def print_all(self):

if self.is_empty():

return

p = self.rear.next # 取得头部节点

print('Head', end='')

while True:

print('-->', p.data, end='')

if p is self.rear: # 到达尾部停止

break

p = p.next

print('-->Finish')

def pop(self, index=0):

"""

弹出指定索引的节点, 默认头部节点

"""

if self.rear is None:

raise IndexError('pop from empty circular linked list.')

p = self.rear

for _ in range(index):

p = p.next

target = p.next

if target is self.rear:

self.rear = None

p.next = target.next

target.next = None

return target.data

def __iter__(self):

if self.rear is None:

return

p = self.rear.next

while p is not self.rear:

yield p.data

p = p.next

yield p.data

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单循环链表是一种特殊的链表,它的最后一个节点的 next 指针指向头节点,形成一个环。 以下是 Python 实现单循环链表的代码: ```python class Node: def __init__(self, data): self.data = data self.next = None class CircularLinkedList: def __init__(self): self.head = None def add_node(self, data): new_node = Node(data) if self.head is None: self.head = new_node new_node.next = self.head else: current = self.head while current.next != self.head: current = current.next current.next = new_node new_node.next = self.head def display(self): if self.head is None: print("List is empty") else: current = self.head while current.next != self.head: print(current.data, end=" ") current = current.next print(current.data, end=" ") def remove_node(self, key): if self.head is None: print("List is empty") return if self.head.data == key: current = self.head while current.next != self.head: current = current.next current.next = self.head.next self.head = self.head.next else: current = self.head prev = None while current.next != self.head: prev = current current = current.next if current.data == key: prev.next = current.next current = current.next def search_node(self, key): if self.head is None: print("List is empty") return current = self.head while current.next != self.head: if current.data == key: print("Node found") return current = current.next if current.data == key: print("Node found") return print("Node not found") # Test the CircularLinkedList class clist = CircularLinkedList() clist.add_node(1) clist.add_node(2) clist.add_node(3) clist.add_node(4) print("Original List") clist.display() clist.remove_node(4) print("\nList after removing node with data=4") clist.display() clist.search_node(2) clist.search_node(5) ``` 输出结果: ``` Original List 1 2 3 4 List after removing node with data=4 1 2 3 Node found Node not found ``` 上面的代码实现了单循环链表的基本操作,包括添加节点、删除节点、查找节点和显示链表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值