小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
1.关于双向链表
因为在之前的文章提到了LinkList 其中就涉及到双向链表 今天就想分享一下关于双向链表的一些关于数据结构的内容 1.双向链表 单链表的结点都只有一个指向后继的指针,所以在每次查询的时候只能从头结点开始,但如果要访问某一个结点的前驱结点,那也只能从头结点开始遍历。正因为有这样的缺点才才引入了双链表,双链表有两个指针,一个指向前驱的指针(prior)和一个后继指针(next)
其结点类型可以这样描述(C)
typedef struct Node{
ElemData data; //数据
struct Node *prior,*next;
}Node,*NodeList;
- 双链表的插入和删除是如何实现的呢?
2.双向链表插入
这里分享的是插入的关键几行代码
s->next=p=>next;
p->next=>prior=s;
s->prior=p;
p-.next=s;
这上面的伪代码是我们在实现插入操作时候的一个顺序 关于插入的详细 在之前的文章已经做了分享可以参考了解
3.双向链表删除
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;
}