📜  实现列表 (1)

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

实现列表

在软件开发中,列表是一种非常常见的数据结构,通常用于存储多个同类型的元素。在程序设计中,我们需要使用一些基本的数据结构和算法来实现常见的列表操作,如添加、删除、查找等。在本文中,我们将介绍如何实现一个基础的列表数据结构。

链表

链表是一种常见的列表实现方式,它存储元素的方式可以分为单向链表和双向链表。在单向链表中,每个元素包含一个指针,指向其后继元素,而在双向链表中,每个元素同时包含一个指针,指向其前驱元素和后继元素。

单向链表

下面是一个简单的单向链表的实现:

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

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

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

    def print_list(self):
        current_node = self.head
        while current_node:
            print(current_node.data)
            current_node = current_node.next

这里我们定义了一个Node类表示链表中的一个节点,一个LinkedList类表示整个链表。我们使用append方法向链表中添加元素,并使用print_list方法将链表中的元素打印出来。此外,我们还定义了一个head属性,用于记录链表中的第一个节点。

双向链表

下面是双向链表的实现:

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

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

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

    def print_list(self):
        current_node = self.head
        while current_node:
            print(current_node.data)
            current_node = current_node.next

可以看到,双向链表相比单向链表仅仅多了一个prev属性来记录上一个节点。这个属性用于支持在双向链表上进行反向遍历。在append方法中,我们需要同时设置当前节点的后继节点的前驱节点。

在使用链表实现列表的时候,我们可以很容易地添加和删除元素,但是在查找元素的时候需要逐个遍历链表。如果需要按照元素的值进行查找,单向链表的效率要比双向链表低一些,而在双向链表中查找元素则可以通过正向或反向遍历实现。

数组

在Python中,我们也可以使用数组来实现列表。Python中的数组主要是通过列表来实现的,因此与Python列表相关的操作同样适用于数组。

下面是一个数组实现的列表:

class MyList:
    def __init__(self):
        self.arr = []

    def append(self, data):
        self.arr.append(data)

    def insert(self, index, data):
        self.arr.insert(index, data)

    def remove(self, data):
        self.arr.remove(data)

    def index(self, data):
        return self.arr.index(data)

    def count(self, data):
        return self.arr.count(data)

    def pop(self, index=-1):
        return self.arr.pop(index)

    def sort(self):
        self.arr.sort()

    def reverse(self):
        self.arr.reverse()

    def clear(self):
        self.arr.clear()

    def __len__(self):
        return len(self.arr)

    def __getitem__(self, index):
        return self.arr[index]

    def __setitem__(self, index, value):
        self.arr[index] = value

    def __delitem__(self, index):
        del self.arr[index]

    def __iter__(self):
        return iter(self.arr)

    def __str__(self):
        return str(self.arr)

这里我们自定义了一个MyList类,它实际上是封装了Python列表的常用操作。通过这个类,我们可以使用常见的列表操作来对数组进行增删改查等操作。可以看到,Python列表的操作非常丰富,涵盖了大多数我们在列表中需要用到的操作。

总的来说,链表和数组是实现列表的两种常用方式。链表可以方便地支持插入和删除操作,但是查找元素需要逐个遍历链表,效率较低。而数组则可以使用内置的Python列表提供的丰富的操作来实现列表,但是插入和删除操作效率较低,因为需要进行元素复制。在选择使用哪种方式时需要针对具体情况进行综合考虑。