📜  删除循环链表的所有奇数节点(1)

📅  最后修改于: 2023-12-03 14:50:19.219000             🧑  作者: Mango

删除循环链表的所有奇数节点

循环链表是一种特殊的链表,它的最后一个节点指向第一个节点。在循环链表中删除节点需要考虑特殊情况,比如要删除的节点是第一个节点或最后一个节点。

本文介绍如何删除循环链表中所有奇数节点的方法。

思路

首先遍历循环链表,找到第一个奇数节点。然后从这个节点开始,每隔一个节点就删除下一个节点,直到只剩下一个偶数节点为止。如果最后一个节点是奇数节点,也要将其删除。

代码实现
class Node:
    def __init__(self, data=None):
        self.data = data
        self.next = None

class CircularLinkedList:
	def __init__(self):
		self.head = None

	def append(self, data):
		new_node = Node(data)
		if not self.head:
			self.head = new_node
			new_node.next = self.head
			return
		curr_node = self.head
		while curr_node.next != self.head:
			curr_node = curr_node.next
		curr_node.next = new_node
		new_node.next = self.head

	def delete_odd_nodes(self):
		if not self.head:
			return
		curr_node = self.head
		while curr_node.next != self.head:
			if curr_node.next.data % 2 != 0:
				del_node = curr_node.next
				curr_node.next = del_node.next
				del del_node
			else:
				curr_node = curr_node.next
		if self.head.data % 2 != 0:
			del_node = self.head
			curr_node = self.head
			while curr_node.next != self.head:
				curr_node = curr_node.next
			curr_node.next = self.head.next
			self.head = curr_node.next
			del del_node

	def display(self):
		if not self.head:
			return
		curr_node = self.head
		while True:
			print(curr_node.data, end=" ")
			curr_node = curr_node.next
			if curr_node == self.head:
				break

c_list = CircularLinkedList()
c_list.append(2)
c_list.append(4)
c_list.append(1)
c_list.append(3)
c_list.append(6)
c_list.append(5)
c_list.delete_odd_nodes()
c_list.display()

输出结果为:

2 4 6
总结

以上就是删除循环链表中所有奇数节点的方法。注意要考虑特殊情况,比如循环链表为空或只有一个节点的情况。同时在删除节点时要注意指针的指向,避免出现断链现象。