返回

排序的循环链表的实现详解

后端

前言

在学习排序的循环链表之前,我们先来了解一下什么是循环链表。循环链表是一种特殊的链表,它的最后一个节点的下一个节点指向第一个节点,形成一个环形结构。循环链表可以用于解决一些特殊的问题,比如约瑟夫环问题。

如何对循环链表进行排序

对循环链表进行排序的方法有很多种,这里介绍一种比较简单的方法,即冒泡排序法。冒泡排序法是一种简单的排序算法,它的基本思想是将相邻的两个元素进行比较,如果顺序不正确,则交换这两个元素,重复这个过程,直到没有元素需要交换为止。

排序的循环链表的实现

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None


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

  def append(self, data):
    new_node = Node(data)
    if self.head is None:
      self.head = new_node
      new_node.next = self.head
    else:
      last_node = self.head
      while last_node.next != self.head:
        last_node = last_node.next
      last_node.next = new_node
      new_node.next = self.head

  def print_list(self):
    temp = self.head
    while temp:
      print(temp.data, end=" ")
      temp = temp.next
      if temp == self.head:
        break

  def sort_list(self):
    if self.head is None:
      return

    last = self.head
    while last.next != self.head:
      last = last.next

    while True:
      swapped = False
      temp = self.head
      prev = None
      while temp.next != self.head:
        if temp.data > temp.next.data:
          if prev is None:
            self.head = temp.next
          else:
            prev.next = temp.next

          temp.next, temp.next.next = temp.next.next, temp
          swapped = True
          prev = temp.next
        else:
          prev = temp
        temp = temp.next

      last.next = temp
      if not swapped:
        break


# 创建一个循环链表
circular_linked_list = CircularLinkedList()
circular_linked_list.append(5)
circular_linked_list.append(2)
circular_linked_list.append(7)
circular_linked_list.append(3)
circular_linked_list.append(1)

# 打印排序前的循环链表
print("排序前:")
circular_linked_list.print_list()

# 对循环链表进行排序
circular_linked_list.sort_list()

# 打印排序后的循环链表
print("\n排序后:")
circular_linked_list.print_list()

结语

排序的循环链表在实际中有很多应用,比如实现约瑟夫环问题等。希望本文能帮助您更好地理解排序的循环链表。如果您有任何问题,欢迎在评论区留言。