📌  相关文章
📜  从循环单链表中删除所有素数节点(1)

📅  最后修改于: 2023-12-03 15:36:18.180000             🧑  作者: Mango

从循环单链表中删除所有素数节点

本文将介绍如何从循环单链表中删除所有素数节点。在开始之前,我们要了解以下几个概念:

  • 循环单链表:一种特殊的单链表,其尾部节点指针指向头部节点。
  • 素数:只能被 1 和它自己整除的数,比如 2、3、5、7 等。
思路分析

为了删除所有素数节点,我们需要对循环单链表进行遍历,并判断每个节点的值是否为素数。如果是素数,则将该节点从链表中删除。由于链表是循环的,最后需要将尾节点指针重新指向头部节点。

下面是实现步骤:

  1. 定义一个函数 is_prime(),用于判断一个数是否为素数。
  2. 用循环语句遍历单链表,对每个节点进行判断。
  3. 如果节点的值为素数,则删除该节点。
  4. 最后将尾节点指针重新指向头部节点。
实现代码
class Node:
    def __init__(self, data=None, next=None):
        self.data = data
        self.next = next

class LinkedList:
    def __init__(self):
        self.head = None
        self.tail = None
    
    def append(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
            self.tail = new_node
            self.tail.next = self.head
        else:
            self.tail.next = new_node
            self.tail = new_node
            self.tail.next = self.head
    
    def print_list(self):
        curr = self.head
        while curr:
            print(curr.data, end=" ")
            curr = curr.next
            if curr == self.head:
                break
    
    def is_prime(self, n):
        if n < 2:
            return False
        for i in range(2, int(n ** 0.5) + 1):
            if n % i == 0:
                return False
        return True
    
    # 删除素数节点
    def remove_prime(self):
        curr = self.head
        pre = self.tail
        while curr != self.tail:
            if self.is_prime(curr.data):
                if curr == self.head:
                    self.head = self.head.next
                    self.tail.next = self.head
                    curr = self.head
                    pre = self.tail
                else:
                    pre.next = curr.next
                    curr = curr.next
            else:
                pre = curr
                curr = curr.next
        if self.is_prime(self.tail.data):
            if self.head == self.tail:
                self.head = None
                self.tail = None
            else:
                pre.next = self.head
                self.tail = pre
测试代码

我们来测试一下删除素数节点的效果:

linked_list = LinkedList()
linked_list.append(1)
linked_list.append(2)
linked_list.append(3)
linked_list.append(4)
linked_list.append(5)
linked_list.append(6)
linked_list.append(7)
linked_list.print_list()
# 输出:1 2 3 4 5 6 7

linked_list.remove_prime()
linked_list.print_list()
# 输出:1 4 6

以上代码可以在 Python3 中运行,输出结果与注释一致。