【984、单链表、双向链表是怎么实现的?循环链表?单链表的时间复杂度?】

55 阅读1分钟

单链表(单向链表)的实现:

单链表是一种线性数据结构,其节点包含数据元素和指向下一个节点的指针。在单链表中,每个节点只有一个指针,指向其后继节点。

class ListNode {
    int data;
    ListNode next;

    public ListNode(int data) {
        this.data = data;
        this.next = null;
    }
}

双向链表的实现:

双向链表在单链表的基础上,每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针。

class DoubleListNode {
    int data;
    DoubleListNode next;
    DoubleListNode prev;

    public DoubleListNode(int data) {
        this.data = data;
        this.next = null;
        this.prev = null;
    }
}

循环链表的实现:

循环链表是一种特殊的链表,其尾节点指向头节点,形成一个循环。

class CircularListNode {
    int data;
    CircularListNode next;

    public CircularListNode(int data) {
        this.data = data;
        this.next = null;
    }
}

单链表的时间复杂度:

  1. 插入操作:

    • 在头部插入(O(1)):直接在头节点之前插入新节点。
    • 在尾部插入(O(n)):需要遍历找到尾节点,然后进行插入。
  2. 删除操作:

    • 删除头节点(O(1)):直接修改头指针。
    • 删除中间节点(O(n)):需要遍历找到待删除节点,然后进行删除。
  3. 查找操作:

    • 按值查找(O(n)):需要遍历链表找到目标值的节点。
  4. 访问操作:

    • 通过索引访问(O(n)):需要从头节点开始遍历到目标索引的节点。

总体来说,单链表的时间复杂度取决于操作的位置和具体实现。在头部的操作复杂度较低,而在尾部或中间的操作可能需要线性遍历,因此对于频繁在尾部或中间插入、删除的场景,可能不是最优选择。