链表介绍
链表的顺序由各个对象里的指针决定。
链表的搜索
遍历链表
// LIST-SEARCH(L,k) 在链表中搜索关键字为k的元素
x=L.head
while(x != null && x.key != k){
x=x.next; // 不相等则继续往后移动
}
return x; // 返回指向该元素的指针
最坏情况下的时间复杂度:O(n), 因为有可能要搜索整个链表。
链表的插入
- 如果在最前端插入,让
L.head
指向x.prev
,x.next
指向
// 元素x的关键字为key,将x插入到链表的前端. LIST-SEARCH(L,x)
x.next = L.head
if L.head != null
L.head.prev = x
L.head = x
x.prev = null
时间复杂度:O(1)
链表的删除
将一个元素x从链表L中移除,要先遍历链表,找到该元素,再执行删除。
// LIST-DELETE(L,x)
if(x.prev != null){
x.prev.next = x.next; // x前一个元素的next指针指向x的后一个元素
}else {
L.head = x.next
}
if(x.next !=null){
x.next.prev = x.prev // x后一个元素的prev指针指向x前一个元素
}
时间复杂度:O(n)
更多学习文档:
双链表的介绍和插入
在Java类中实现单链表
在Java中实现单链表
package com.carrie.algorithm;
/**
* https://www.geeksforgeeks.org/implementing-a-linked-list-in-java-using-class/
* <p>
* 链表有多种形式,这里的是单链表
* <p>
* 一个节点有 data 和 next. next是指针,指向下一个节点. next prev都是指针,指针不放元素值,是作为顺序指向
* [ Data |next] ——> [ Data |next]
* head
*/
public class LinkedList {
Node head; // head of list
static class Node {
int data;
Node next;
Node(int d) {
data = d;
next = null;
}
}
// **************DELETION BY KEY**************
// method to insert a new node
public static LinkedList insert(LinkedList linkedList, int data) {
// 用 data 创建一个新Node
Node newNode = new Node(data);
// 如果 l.head 是空的,那么 让newNode 成为head
if (linkedList.head == null) {
linkedList.head = newNode;
} else {
Node last = linkedList.head;
// 遍历linkedList, 直到最后一个节点。在末尾插入新节点,让最后一个节点的next指向新节点
while (last.next != null) {