LinkedList:双向链表与实现

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

所谓双向链表:

(由此图可见老夫深厚的画功)

链表,就是由一个一个的节点连接组成。

在这里,每一个节点都是由三部分组成:上一个节点、当前节点的元素、下一个节点

当链表中只有一个节点的时候,这个节点指向的上一个节点是空的,下一个节点也是空的

当有多个节点的时候,第一个节点的上一个节点是空的,最后一个节点的下一个节点也是空的。

如上图:A节点的下一个节点指向了B节点,B节点的上一个节点指向了A节点

不说了...鉴于本人表达能力有限...直接上代码吧...

1publicclassMyLinkedList {2/*第一个节点*/3PRivateNode first;4/*最后一个节点*/5privateNode last;6/*大小*/7privateintsize;8/**9* 获取这个链表的大小(元素的个数)10*@return11*/12publicintsize(){13returnsize;14}15/**16* 这个方法是从LinkedList.node(index)方法中复制过来的,稍加修改17* 用于返回指点下标处的节点18*@return19*/20privateNode node(intindex){21/*22* 打个比方:23* size = 6;24* size >> 1 = 325* 如果index小于3的话,就从第一个找到最后一个26* 如果index大于3的话,就从最后一个找到第一个27* 下面代码亦是如此28*/29if(index < (size >> 1)) {30Node x =first;31for(inti = 0; i < index; i++)32x =x.next;33returnx;34}else{35Node x =last;36for(inti = size - 1; i > index; i--)37x =x.prev;38returnx;39}40}41/**42* 增加一个节点43*@paramobj 要增加的元素44*/45publicvoidadd(Object obj){46Node temp =newNode();//新的节点47/*新节点的元素赋值*/48temp.element =obj;4950if(first==null) {//如果第一个节点是空的,那就是没有节点51//这个节点既然是第一个节点,所以节点的prev点和next都是空的,所以,不用赋值52//同理,这个新插入的节点是第一个,也是最后一个53first =temp;54last =temp;55}else{//否则,那就意味着这个节点不是空的。56//新节点的prev就是在这个节点插入前的最后一个节点57temp.prev =last;58//而插入前的最后一个节点的next就是这个新的节点了59//这样,就会形成一条链:a的下一个是b,b的上一个是a,a的下一个是b......60last.next =temp;61//最后,新的节点就是最后一个节点了62last =temp;63}64//插入成功size++;65size++;66}67/**68* 增加一个节点,指定位置69*@paramindex70*@paramobj71*/72publicvoidadd(intindex, Object obj){73Node temp = node(index);//得到的节点74Node newNode =newNode();//新的节点75newNode.element =obj;7677if(temp!=null) {//如果得到的指定节点不是空的话78//得到temp的上一个节点79Node tempPrev =temp.prev;808182//tempPrev的下一个节点赋值为newNode83tempPrev.next =newNode;84//同时,newNode的上一个节点赋值为tempPrev85newNode.prev =tempPrev;868788//然后newNode的下一个节点便是这个一开始就指定的temp节点89newNode.next =temp;90//temp的上一个节点赋值为newNode91//这样在指定元素之前插入了一个新的元素92temp.prev =newNode;93}94size++;95}96/**97* 删除98*@paramindex99*/100publicvoidremove(intindex){101/*102* 删除...103* 有 a b c三个元素104* a的下一个节点是b b的下一个节点是c105* c的上一个节点是b b的上一个节点是a106* --107* 比如删除了b108* 那就要把a 和 c 连接起来。109*110* 连接好了后,就是:111* a 下一个节点是 c112* c 上一个节点是 a113*114*/115116Node temp = node(index);//得到指定下标的元素117if(temp!=null) {118/*119120//得到temp的上一个节点121Node tempPrev = temp.prev;122//得到temp的下一个节点123Node tempNext = temp.next;124//tempPrev的下一个节点是tempNext125tempPrev.next = tempNext;126//而tempNext的上一个节点就是tempPrev127tempNext.prev = tempPrev;128129*/130131//temp的上一个节点的下一个节点就是temp的下一个节点132temp.prev.next =temp.next;133//temp的下一个节点的上一个节点就是temp的上一个节点134temp.next.prev =temp.prev;135}136size--;137}138/**139* 根据下标获取元素140*@paramindex 元素的索引141*@return142*/143publicObject get(intindex){144returnnode(index).element;//得到指定节点的元素145}146/*------------------------------------------------------------*/147publicstaticvoidmain(String[] args) {148MyLinkedList list =newMyLinkedList();149list.add("a");150list.add("b");151list.add(1,"B");152list.remove(1);153System.out.println(list.get(1));154System.out.println("当前链表的大小:"+list.size());155}156}157/**158* 节点类159*/160classNode{161/*162* 表示上一个节点163* 所以使用节点类型164*/165Node prev;166/*表示下一个节点*/167Node next;168/*当前节点的元素*/169Object element;170171publicNode() {172}173174publicNode(Node prev, Node next, Object element) {175this.prev =prev;176this.next =next;177this.element =element;178}179180}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航