单链表(单向链表)的实现:
单链表是一种线性数据结构,其节点包含数据元素和指向下一个节点的指针。在单链表中,每个节点只有一个指针,指向其后继节点。
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;
}
}
单链表的时间复杂度:
-
插入操作:
- 在头部插入(O(1)):直接在头节点之前插入新节点。
- 在尾部插入(O(n)):需要遍历找到尾节点,然后进行插入。
-
删除操作:
- 删除头节点(O(1)):直接修改头指针。
- 删除中间节点(O(n)):需要遍历找到待删除节点,然后进行删除。
-
查找操作:
- 按值查找(O(n)):需要遍历链表找到目标值的节点。
-
访问操作:
- 通过索引访问(O(n)):需要从头节点开始遍历到目标索引的节点。
总体来说,单链表的时间复杂度取决于操作的位置和具体实现。在头部的操作复杂度较低,而在尾部或中间的操作可能需要线性遍历,因此对于频繁在尾部或中间插入、删除的场景,可能不是最优选择。