📜  门| GATE CS 2019 |问题 13(1)

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

GATE CS 2019 - 问题 13

问题 13 是2019年计算机科学专业研究生入学考试(GATE)的其中一个问题。这个问题涉及到了程序设计和数据结构。下面是该问题的介绍和解答。

问题描述

问题 13 要求我们创建一个程序来实现一个双向链表的具体操作。具体要求如下:

实现一个双向链表,链表节点的定义如下:

class Node {
    int data;
    Node prev;
    Node next;
}

链表需要支持以下操作:

  • getNodeAtIndex(int index):返回链表第index个位置的节点。
  • insertNodeAtIndex(Node node, int index):在第index个位置插入一个新的节点。
  • deleteNodeAtIndex(int index):删除链表中第index个位置的节点。

需要注意的是,链表中的第一个节点的index是0,第二个节点的index是1,以此类推。

解答
class DoublyLinkedList {
    Node head;

    // 返回链表第index个位置的节点
    Node getNodeAtIndex(int index) {
        Node current = head;
        int counter = 0;

        while (current != null && counter != index) {
            current = current.next;
            counter++;
        }

        return current;
    }

    // 在第index个位置插入一个新的节点
    void insertNodeAtIndex(Node node, int index) {
        if (index == 0) {
            node.next = head;
            if (head != null) {
                head.prev = node;
            }
            head = node;
            return;
        }

        Node previous = getNodeAtIndex(index - 1);
        if (previous == null) {
            System.out.println("Invalid index");
            return;
        }

        node.next = previous.next;
        if (previous.next != null) {
            previous.next.prev = node;
        }
        previous.next = node;
        node.prev = previous;
    }

    // 删除链表中第index个位置的节点
    void deleteNodeAtIndex(int index) {
        Node nodeToDelete = getNodeAtIndex(index);
        if (nodeToDelete == null) {
            System.out.println("Invalid index");
            return;
        }

        if (nodeToDelete.prev != null) {
            nodeToDelete.prev.next = nodeToDelete.next;
        } else {
            head = nodeToDelete.next;
        }

        if (nodeToDelete.next != null) {
            nodeToDelete.next.prev = nodeToDelete.prev;
        }
    }
}

此处介绍了一个双向链表的实现,其中包含了三个基本操作:获取指定位置的节点、在指定位置插入节点和删除指定位置的节点。

请注意,以上代码仅仅提供了问题 13 的一个解答示例,你可以根据实际需求进行修改或扩展。