Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1347665
  • 博文数量: 370
  • 博客积分: 10654
  • 博客等级: 中将
  • 技术积分: 4396
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 15:44
文章分类

全部博文(370)

文章存档

2012年(36)

2011年(195)

2010年(139)

分类: C/C++

2010-11-13 17:16:34

   哨兵(sentinel)是一个哑对象,可以简化边界条件。是一个附加的链表节点,该节点作为第一个节点,但是它其实并不存储任何东西,只是为了操作的方便而引入的。因此,如果一个链表有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点(个位置的时候,需要考虑该位置上原来的节点并没有前驱节点;而如果有哨兵节点的话, 线性表的每个位置的节点都有前驱节点,因此可以统一处理。(注意:哨兵节点根本不出现在线性表中,所以虽然它没有前驱,但是前面的那句话并不矛盾)。


              带哨兵节点的双链表     
  1. package com.eshore.sweetop.dataframe;

  2. public class DoubleLinkedList {
  3.     private Element nil;
  4.     
  5.     public DoubleLinkedList() {
  6.         nil=new Element(null);
  7.         nil.pre=nil;
  8.         nil.next=nil;
  9.     }
  10.     
  11.     public void insert(Object o){
  12.         Element e=new Element(o);
  13.         e.next=nil.next;
  14.         nil.next.pre=e;
  15.         nil.next=e;
  16.         e.pre=nil;
  17.     }
  18.     
  19.     public Element search(Object o){
  20.         Element e=nil.next;
  21.         while(e!=nil&&e.key!=o){
  22.             e=nil.next;
  23.         }
  24.         return e;
  25.     }
  26.     
  27.     public void delete(Object o){
  28.         Element e=search(o);
  29.         e.pre.next=e.next;
  30.         e.next.pre=e.pre;
  31.     }
  32.     
  33.     public class Element{
  34.         private Element pre;
  35.         private Element next;
  36.         public Object key;
  37.         
  38.         public Element(Object x){
  39.             this.key=x;
  40.         }
  41.     }
  42.     
  43.     public static void main(String[] args) {
  44.         DoubleLinkedList dll=new DoubleLinkedList();
  45.         dll.insert(Integer.valueOf(1));
  46.         System.out.println(dll.search(Integer.valueOf(1)).key);
  47.         dll.delete(Integer.valueOf(1));
  48.     }
  49. }

阅读(5283) | 评论(0) | 转发(0) |
0

上一篇:get()函数

下一篇:Ubuntu系统维护小知识

给主人留下些什么吧!~~