📜  门| GATE-CS-2015(Set 1)|问题10(1)

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

题目介绍:GATE-CS-2015(Set 1) 问题10

本题涉及到数据结构和算法的知识点,要求编写一个程序实现具有以下功能的双向链表:

  • 插入一个节点
  • 删除一个节点
  • 反转整个链表

实现思路

为了实现上述功能,我们需要设计一个双向链表的数据结构,其中每个节点都包含前驱节点、后继节点以及节点值这三个组成部分。

接下来,我们分别来看如何实现以上三个功能。

插入节点

插入节点操作通常分为两种情况:

  • 将新节点插在链表的头部
  • 将新节点插入链表的其他位置

对于第一种情况,我们只需要将新节点的后继节点指向链表原先的头结点,并将链表的头结点指向新节点即可。

如下示例代码:

def insert_head(self, node):
    if self.head is None:
        self.head = self.tail = node
    else:
        node.next = self.head
        self.head.prev = node
        self.head = node

对于第二种情况,我们需要先找到待插入位置的节点,然后执行如下操作:

def insert_node(self, pos, node):
    cur = self.head
    while cur and cur != pos:
        cur = cur.next
    if cur is None:
        print("Position not found.")
        return
    node.next = cur
    node.prev = cur.prev
    cur.prev.next = node
    cur.prev = node
删除节点

删除节点操作通常也分为两种情况:

  • 删除链表头部的节点
  • 删除链表其他位置的节点

对于第一种情况,我们只需要将链表的头结点指向下一个节点即可。

如下示例代码:

def delete_head(self):
    if self.head is None:
        print("Empty doubly linked list.")
    elif self.head == self.tail:
        self.head = self.tail = None
    else:
        self.head = self.head.next
        self.head.prev = None

对于第二种情况,我们需要先找到待删除的节点,然后执行如下操作:

def delete_node(self, node):
    if node is None:
        print("Cannot delete None node.")
        return
    if node == self.head:
        self.delete_head()
    elif node == self.tail:
        self.tail = node.prev
        self.tail.next = None
        node.prev = None
    else:
        node.prev.next = node.next
        node.next.prev = node.prev
        node.prev = node.next = None
反转链表

反转链表的过程可以使用一个指针遍历链表,并不断将各个节点的前驱节点和后继节点进行交换即可。最终,头结点和尾节点都需要交换。

如下示例代码:

def reverse_list(self):
    cur = self.head
    while cur:
        cur.prev, cur.next = cur.next, cur.prev
        cur = cur.prev
    self.head, self.tail = self.tail, self.head

总结

至此,我们已经实现了一个具有插入、删除和反转链表功能的双向链表。该程序兼顾了代码的效率和可读性,可以供初学者参考。