数据结构线性表之双向链表

双向链表

  在结点中设两个引用域,一个保存直 接前驱结点的地址,叫 prev,一个直接后继结点的地址,叫 next,这样的链表就 是双向链表(Doubly Linked List)。双向链表的结点结构示意图如图 2.15 所示。

 

   双向链表结点类的实现如下所示。

    public class DbNode<T>
    {
        private T data; //数据域
        private DbNode<T> prev; //前驱引用域
        private DbNode<T> next; //后继引用域
                                //构造器
        public DbNode(T val, DbNode<T> p)
        {
            data = val;
            next = p;
        }
        //构造器
        public DbNode(DbNode<T> p)
        {
            next = p;
        }
        //构造器
        public DbNode(T val)
        {
            data = val;
            next = null;
        }
        //构造器
        public DbNode()
        {
            data = default(T);
            next = null;
        }
        //数据域属性
        public T Data
        {
            get
            {
                return data;
            }
            set
            {
                data = value;
            }
        }
        //前驱引用域属性
        public DbNode<T> Prev
        {
            get
            {
                return prev;
            }
            set
            {
                prev = value;
            }
        }
        //后继引用域属性
        public DbNode<T> Next
        {
            get
            {
                return next;
            }
            set
            {
                next = value;
            }
        }
    }

设 p 是指向双向链表中的某一结点,即 p 存储的是该结点的地址,现要将一 个结点 s 插入到结点 p 的后面,插入过程如图 2.16 所示(以 p 的直接后继结点 存在为例)。

 

 设 p 是指向双 向链表中的某一结点,即 p 存储的是该结点的地址,现要将一个结点 s 插入到结 点 p 的后面,插入过程如图 2.17 所示(以 p 的直接后继结点存在为例)。

 

 循环链表

  最后一个结点的引用域不是空引用, 而是保存的第一个结点的地址(如果该链表带结点,则保存的是头结点的地址), 也就是头引用的值。带头结点的循环链表(Circular Linked List)如图 2.18 所示。

 

   循环链表的基本操作与单链表大体相同,只是判断链表结束的条件并不是判 断结点的引用域是否为空,而是判断结点的引用域是否为头引用,其它没有较大的变化。

 

posted @ 2021-10-15 14:14  JackYgy  阅读(150)  评论(0)    收藏  举报