手写双链表
来源:互联网 发布:淘宝情趣用品专卖店 编辑:程序博客网 时间:2024/04/29 17:25
链表要从数据结构开始说起了,虽然大学时候简单学过一点点数据结构,但我一直不理解数据结构这门课程到底讲什么,只简单的知道链表.这次学习Handler源码,在追踪Message原理的时候了解到Message其实就是一个单链表,就学习了一下装逼的双链表.通过对双链表的仔细了解,认识到数据结构就是组成复杂数据的模式.
package com.yang.test;import java.util.Iterator;import java.util.Spliterator;import java.util.function.Consumer;public class MyDoubleLink implements Iterable<Object>{ private class Node{ Node(Object data){ this.data = data; } Node next; Node prev; Object data; } private Node head; private Node rear; public void add(Object data){ Node node = new Node(data); if(head == null){ //如果是第一个节点,就让head和rear元素都指向它 head = node;//始终指向首节点,删除节点时候也可作为游标完成节点删除 rear = node;//相当于一个游标,使新节点和链接链接起来,如果没有它就没办法取出之前链表的最后一个节点 }else{ //head元素始终指向第一个节点,rear元素总是指向最后一个节点 rear.next = node;//此时rear就是第一个节点的对象,让首节点head的next指向新添加的节点node node.prev = rear;//让新添加节点的prev指向上一个节点的对象即rear rear = node;//让rear本身指向新添加的节点 } } public void remove(Object data){ Node node = find(data); //要删除一个节点就是删除一个对象,当没有引用(变量)指向这个对象的时候,这个对象就会很快被回收掉。 //所以要删除这个节点,就需要把所有指向这个对象的引用(变量)都去掉。(注意:这个对象对其他对象的引用不影响对它本身的回收) if(node != null){ if(node == head && node == rear){//只有一个节点 head = null; rear = null; }else if(node == head){//头结点 head = head.next; head.prev = null; }else if(node == rear){//尾节点 rear = rear.prev; rear.next = null; }else{//中间节点 node.prev.next = node.next; node.next.prev = node.prev; } } } public boolean contains(Object data){ Node node = find(data); return node != null; } private Node find(Object data){ Node node = head; while (node != null) { if(node.data.equals(data) && node.data.hashCode() == data.hashCode()){ break; }else{ node = node.next; } } return node; } public void print(){ Node temp = head; while(temp != null){ System.out.println(temp.data+","); temp = temp.next; } } //使该链表的对象可以使用增强for循环 public Iterator<Object> iterator() { Iterator<Object> iterator = new Iterator<Object>() { private Node temp = head; public void forEachRemaining(Consumer<? super Object> arg0) { // TODO Auto-generated method stub } public boolean hasNext() { return temp != null; } public Object next() { Object data = temp.data; temp = temp.next; return data; } public void remove() { // TODO Auto-generated method stub } }; return iterator; }}
–作为普通android程序员,有了这个carry技能,的确可以在面试时候小小的装下比了
0 0
- 手写双链表
- 手写
- 手写打印机
- penpower手写
- 手写ajax
- 手写日记
- 手写视图
- DataSet手写
- 手写 ajax
- android 手写
- 手写Ajax
- 手写yueshu
- 手写 json
- 手写NSLayoutContraint
- 手写代理
- 手写笔记
- collectionView(手写)
- 手写stack
- 数据库设计(9)-ER-to-SQL
- Android4.4 之Bluetooth整理
- IOS图片的高斯模糊
- uva 11292 勇者斗恶龙 The Dragon of Loowater
- 浅谈Sql Server中的 隔离层级(Isolation Levels)
- 手写双链表
- Spring BeanFacoty doCreateBean方法分析
- TelephoneBook-method包-TelephoneBookDB类
- Bootstrap学习:导航栏
- 八皇后问题
- android菜鸟进阶之路——照相机的调用(拍照和裁剪)
- Android_Palette抽取Bitmap颜色
- bootstrap中常用的插件及示例
- Bootstrap学习:面包屑导航