c# 数据结构 ---双链表

再来个双链表,其实和单链表差不多拉,循环链表也是,只是把尾元素指向Header就OK了。所以就不贴循环链表了。

  1 /// <summary>
  2    /// 双链表的节点
  3    /// </summary>

  4    public class DoubleLinkNode
  5    {
  6        private object _data;//存储数据
  7        private DoubleLinkNode _rLink;  //存储右表的指针
  8        private DoubleLinkNode _lLink; //存储左边的指针
  9
 10        public object Data
 11        {
 12            get return _data; }
 13            set { _data = value; }
 14        }

 15
 16
 17        public DoubleLinkNode LLink
 18        {
 19            get return _lLink; }
 20            set { _lLink = value; }
 21        }

 22
 23        public DoubleLinkNode RLink
 24        {
 25            get return _rLink; }
 26            set { _rLink = value; }
 27        }

 28
 29        
 46    }

 47
 48
 49/// <summary>
 50    /// 双链表
 51    /// </summary>

 52    public class DoubleLinkList
 53    {
 54        /// <summary>
 55        /// 头节点
 56        /// </summary>

 57        DoubleLinkNode header;
 58
 59        public DoubleLinkList()
 60        {
 61            header = new DoubleLinkNode("header");
 62            header.LLink = null;
 63            header.RLink = null;
 64        }

 65
 66
 67
 68        /// <summary>
 69        /// 双链表的查找
 70        /// </summary>
 71        /// <param name="i">节点位置</param>
 72        /// <returns>找到的节点</returns>

 73        public DoubleLinkNode FindIndex(int i)
 74        {
 75            if (i == -1 | i == 0return header;
 76
 77            DoubleLinkNode resultNode = header.RLink;
 78
 79            int j = 1;
 80            while (resultNode != null && j < i)
 81            {
 82                resultNode = resultNode.RLink;
 83                j++;
 84            }

 85
 86            return resultNode;
 87        }

 88
 89
 90        /// <summary>
 91        /// 数据的插入
 92        /// </summary>
 93        /// <param name="data">要插入的数据</param>
 94        /// <param name="i">插入位置</param>
 95        /// <returns>返回插入后的节点</returns>

 96        public DoubleLinkNode Insert(Object data, int i)
 97        {
 98            DoubleLinkNode newNode,currentNode;
 99            newNode = new DoubleLinkNode(data);
100            currentNode = FindIndex(i - 1);
101            if (currentNode.RLink == null)
102            {
103                currentNode.RLink = newNode;
104                newNode.LLink = currentNode;
105            }

106            else
107            {
108                newNode.RLink= currentNode.RLink;
109                newNode.LLink = currentNode;
110                currentNode.RLink = newNode;
111            }

112
113            return newNode;
114        }

115
116        /// <summary>
117        /// 删除所传入节点的下一个节点
118        /// </summary>
119        /// <param name="node"></param>

120        public void DeleteAfter(DoubleLinkNode node)
121        {
122            if (node.RLink != null && node != null)
123            {
124                //注意此处顺序不能颠倒。
125                //先给要删除节点的下一个节点的左link赋值,再给要删除节点的前一个节点的右link赋值
126                node.RLink.RLink.LLink = node.RLink.LLink;
127                node.RLink = node.RLink.RLink;
128            }

129        }

130
131        /// <summary>
132        /// 删除指定位置的节点
133        /// </summary>
134        /// <param name="i"></param>

135        public void DeleteNode(int i)
136        {
137            DoubleLinkNode node = FindIndex(i - 1);
138
139            //注意此处顺序不能颠倒。
140            //先给要删除节点的下一个节点的左link赋值,再给要删除节点的前一个节点的右link赋值
141            node.RLink.RLink.LLink = node.RLink.LLink;
142            node.RLink = node.RLink.RLink;
143        }

144
145
146        /// <summary>
147        /// 计算双链表的长度(包括表头节点)
148        /// </summary>
149        /// <returns>长度</returns>

150        public int Length()
151        {
152            DoubleLinkNode node = header;
153            int count = 0;
154
155            while (node != null)
156            {
157                node = node.RLink;
158                count++;
159            }

160            return count;
161        }

162
163    }
posted @ 2008-03-25 09:12  GodSpeed  阅读(558)  评论(1编辑  收藏  举报