第九讲 数据结构之双向链表

第九讲 数据结构之双向链表_第1张图片

大家都知道,任何事物出现的初期都显得有些不完善。例如我们的火车刚发明的时候是只有一个“头”的,所以如果它走的线路是如下:
A->B->C->D->E->F->G->H->I->J->K->L->A
假设这会儿火车正停在K处呢,要他送一批货到J处,那么它将走的路线是:
K->L->A->B->C->D->E->F->G->H->I->J
嗯,所以后来我们的火车就都有两个头了。看完这个例子,大家就明白双向链表的必要性了吧。

双向链表节点结构


public class DualNode {
    public int data;
    public DualNode prior;
    public DualNode next;
}

如图:

第九讲 数据结构之双向链表_第2张图片

双向链表之循环链表
既然单链表可以有循环链表,那么双向链表当然也可以有,如下图:
第九讲 数据结构之双向链表_第3张图片

双向链表插入和删除讲解

插入
第九讲 数据结构之双向链表_第4张图片
插入图解

核心代码:

s.next = p; 
s.prior = p.prior;  
p.prior.next = s;   
p.prior = s;
删除
第九讲 数据结构之双向链表_第5张图片
删除图解

核心代码:

p.prior.next = p.next;
p.next.prior = p.prior; 

双向链表代码实现

/**
 * @author wangxiaojian
 */
public class DualList {

    public class DualNode {
        public int data;
        public DualNode prior;
        public DualNode next;
    }


    private DualNode head;
    public DualList(){
        head = new DualNode();
        head.prior = head;
        head.next = head;
        createList(10);
    }
    /**
     * 创建n个数据的链表
     * @param n
     */
    public void createList(int n){
        DualNode p = head;
        for(int i=1;i<=n;i++)
        {
            DualNode q = new DualNode();
            q.data = i;
            p.next = q;
            head.prior = q;
            q.prior = p;
            q.next = head;
            p = q;
        }
    }


    /**
     * 在index的位置上插入数据为data的节点
     * @param index
     * @param data
     */
    public void insert( int index, int data)
    {
        DualNode p = head;
        DualNode s = new DualNode();
        for (int i=0;i 
  
第九讲 数据结构之双向链表_第6张图片
欢迎关注,每天更新

你可能感兴趣的:(第九讲 数据结构之双向链表)