链表的原理
来源:互联网 发布:散粉哪个比较好知乎 编辑:程序博客网 时间:2024/06/06 09:51
1.单链表有两个属性:
value,值
next,指向下一个节点的指针
2.双链表附加一个属性:
pre,指向前一个节点的指针
3.下面自定义一个链表节点的类:
/** * Created by liupf */public class ListNode<T> { public T value; public ListNode<T> next; public ListNode(T value, ListNode<T> next) { this.value = value; this.next = next; } public ListNode() { } public ListNode<T> pre;//指向前一个节点的指针}
4.有上面的基础,就可以实现一个微型的单链表API
/** * Created by liupf */public class MiniList<T> { private ListNode<T> head=new ListNode<>(null,null); public Comparator<T> comp;//定义比较器 public int compare(T a,T b){ if (comp!=null){ return comp.compare(a,b); }else{ Comparable<T> c= (Comparable<T>) a; return c.compareTo(b); } } /** * 获取链表中的最大值 * @return */ public T getMax(){ if (head.next==null){ return null; } ListNode<T> p=head.next; T max=p.value; p=p.next; while(p!=null){ if (compare(p.value,max)>0){ max=p.value; } p=p.next; } return max; } /** * 将一个数组转化成单链表 * @param array */ public void arrayToList(T[] array){ ListNode<T> p=head;//指定头指针 for (T t:array){ ListNode<T> node=new ListNode<>(t,null); p.next=node; p=node; } } public void printList(){ ListNode<T> p=head.next; while (p!=null){ System.out.print(p.value+" "); p=p.next; } System.out.println(" "); } /** * 链表的插入 * @param index * @param value */ public void insert(int index,T value){ ListNode<T> p=head; for (int i=0;i<=index;i++){ p=p.next;//链表指针向后移动 } ListNode<T> node=new ListNode<>(value,null); node.next=p.next; p.next=node; } /** * 链表的删除 * @param index * @return */ public T remove(int index){ ListNode<T> pre=head; for (int i=0;i<index;i++){ pre=pre.next; } ListNode<T> node=pre.next; pre.next=node.next; return node.value; } /** * 链表的查询 * @param index * @return */ public T get(int index){//查询 ListNode<T> p=head; for (int i=0;i<=index;i++){ p=p.next; } return p.value; } /** * 修改链表 * @param index * @param value */ public void set(int index,T value){ ListNode<T> p=head; for (int i=0;i<=index;i++){ p=p.next; } p.value=value; } /** * 非递归逆序打印链表 */ public void printReverse(){ if (head.next==null){ return; } Stack<T> stack=new Stack(); ListNode<T> node=head.next; while (node!=null){ stack.push(node.value); node=node.next; } while (!stack.isEmpty()){ System.out.print(stack.pop()+" "); } System.out.println(); } /** * 递归逆序打印链表 */ public void printInverseRecursive(){ if (head.next==null){ return ; } recursive(head.next); System.out.println(); } private void recursive(ListNode<T> p){ if (p!=null){ recursive(p.next); System.out.print(p.value+" "); } }}
相信通过上面的讲解,应该对单链表有一定的认识了
0 0
- 链表的原理
- 单向链表的原理
- 链表逆序的原理及实例
- 链表的实现与原理
- 静态链表的原理及实现
- 双端链表(不是双向链表)的原理
- 链表的原理及java实现
- 原型链的原理
- 原型链的原理
- 原型链的原理
- 链表原理
- 单向链表原理
- 链表原理
- 链表----链表原理
- 响应者链的原理
- 彩虹表的原理简介
- 彩虹表的原理简介
- 跳跃表实现的原理
- iOS超炫酷动画集合
- Crontab使用语法格式
- Java命令学习系列(六)——jinfo
- iOS tableview cell下拉展开显示详情选择城市
- 虚拟机安装jzmq 方法
- 链表的原理
- angularjs 几个模块学习
- Java命令学习系列(七)——javap
- 《学习笔记》android6.0 锁屏壁纸功能
- Tomcat指定jdk版本启动
- SPOJ 7001. Visible Lattice Points 莫比乌斯反演
- 附件(blob)下载输出实例代码参考
- 使用js Math.random()函数生成n到m间的随机数字
- wampserver环境配置--Apache2.4+PHP5.6+Mysql5.7.11