📜  门|门 IT 2006 |第 40 题(1)

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

门|门 IT 2006 |第 40 题

该题目为门|门 IT 2006年度考试中的第40道题目,主要考查程序员在数据结构和算法方面的知识和应用能力。该题目要求实现一个双向链表,其中包含以下方法:

  • add_before(node, data):在指定节点前插入新节点
  • add_after(node, data):在指定节点后插入新节点
  • remove(node):移除指定节点
  • print_all():打印所有节点的数据

在实现该双向链表时,需要考虑以下几个方面:

  1. 双向链表的数据结构定义:节点应包含前驱节点、后继节点以及数据三个属性。
  2. 双向链表的初始化:需要创建一个头结点,并将头结点的前驱节点和后继节点均指向自己。
  3. 插入和移除节点操作:需要注意更新前驱和后继节点的指向,以及处理边界情况(如插入第一个节点时需要特殊处理)。
  4. 打印所有节点的数据:需要遍历整个链表并打印每个节点的数据。

以下是一个示例代码片段:

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

class DoublyLinkedList:
    def __init__(self):
        self.head = Node(None)
        self.tail = Node(None)
        self.head.next = self.tail
        self.tail.prev = self.head

    def add_before(self, node, data):
        new_node = Node(data)
        prev_node = node.prev
        prev_node.next = new_node
        new_node.prev = prev_node
        new_node.next = node
        node.prev = new_node

    def add_after(self, node, data):
        new_node = Node(data)
        next_node = node.next
        next_node.prev = new_node
        new_node.next = next_node
        new_node.prev = node
        node.next = new_node

    def remove(self, node):
        prev_node = node.prev
        next_node = node.next
        prev_node.next = next_node
        next_node.prev = prev_node

    def print_all(self):
        node = self.head.next
        while node != self.tail:
            print(node.data)
            node = node.next

以上代码片段展示了如何实现一个双向链表,并包含了四个方法的实现。在使用该代码片段时,需要先创建一个DoublyLinkedList对象,然后通过该对象调用各个方法。如下所示:

dll = DoublyLinkedList()
node1 = dll.add_before(dll.tail, "node1")
node2 = dll.add_before(dll.tail, "node2")
dll.remove(node1)
dll.add_after(node2, "node3")
dll.print_all()

运行以上代码将会输出:

node2
node3