双向链表(结合数据结构)

1,872 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

1.关于双向链表

因为在之前的文章提到了LinkList 其中就涉及到双向链表 今天就想分享一下关于双向链表的一些关于数据结构的内容 1.双向链表 单链表的结点都只有一个指向后继的指针,所以在每次查询的时候只能从头结点开始,但如果要访问某一个结点的前驱结点,那也只能从头结点开始遍历。正因为有这样的缺点才才引入了双链表,双链表有两个指针,一个指向前驱的指针(prior)和一个后继指针(next)

其结点类型可以这样描述(C)

typedef struct Node{
    ElemData data; //数据
    struct Node *prior,*next;
}Node,*NodeList;

image.png

  • 双链表的插入和删除是如何实现的呢?

2.双向链表插入

这里分享的是插入的关键几行代码

image.png

s->next=p=>next;
p->next=>prior=s;
s->prior=p;
p-.next=s;

这上面的伪代码是我们在实现插入操作时候的一个顺序 关于插入的详细 在之前的文章已经做了分享可以参考了解

3.双向链表删除

10fd480248a37f32ba2251fb4e6f8e8.png

p->next = q->next;
q->next->prior = p;
free(q)

我们通过上面上面的思想以及伪代码:删除一个结点 就是将P的后继结点指向其删除结点的后一个结点c 并将c结点的前驱结点指向p这样就形成了一个链 我们再来看LinkList中 他实现删除结点的java代码:这两行关键代码: **next.prev = prev; prev.next = next;**就体现了这样一个思想

E unlink(Node<E> x) {
    // assert x != null;
    final E element = x.item;
    final Node<E> next = x.next;
    final Node<E> prev = x.prev;

    if (prev == null) {
        first = next;
    } else {
        prev.next = next;
        x.prev = null;
    }

    if (next == null) {
        last = prev;
    } else {
        next.prev = prev;
        x.next = null;
    }

    x.item = null;
    size--;
    modCount++;
    return element;
}