手写链表(二)-使用内部类实现添加、查询、定位、插入等功能
来源:互联网 发布:台湾对外贸易数据 编辑:程序博客网 时间:2024/05/18 03:03
要求是这样的:
我们在示例(示例即本人博客手写链表(一))中给出的链表类是递归定义的。这样做的好处是链表的某个局部也是一个链表,这与链表在逻辑上的概念具有一致性。
但出于效率的考虑,经常需要引入一些辅助变量来加快操作的速度,这时,如果能给链表类型增加一个外壳就很方便后续的处理。
基本思路:
class MyList {
private Node head;
class Node {
int data;
Node next;
}
....
}
这种方案中,MyList不是递归定义的,而内部包含的Node类代表了链表的真实结构。MyList类是一个外壳类。它通过持有head 指针来记录一个链表的头在哪里。
请试着完善这种方案。
使用内部类实现添加、查询、定位、插入等功能
public class MyList<T> {class Node{public Node next;public T data;public Node(T data, Node next){this.data=data;this.next=next;}}private Node head;private Node tail;private int size=0;public MyList(){}public MyList(T headValue){this.head=new Node(headValue, null);this.tail=this.head;size++;}public int length(){return size;}public boolean empty(){return size==0;}public void add(T element){if(size==0){this.head=new Node(element, null);this.tail=this.head;}else{Node next=new Node(element, null);tail.next=next;tail=next;}size++;}//头增加方式public void addToHead(T element){if(size==0){this.head.data=element;this.head.next=null;this.tail=this.head;}else{Node header=new Node(element, head);head=header;}size++;}//插入public void insert(T element , int index){if(index<0 | index>size-1) throw new IndexOutOfBoundsException("越界");else if(index==0) addToHead(element);else if(size==0) add(element);else{Node previous=head;for(int i=0;i<=index & previous!=null;i++,previous=previous.next){if(i==index-1){previous.next=new Node(element,previous.next);size++;break;}}}}//搜索public T search(int index){if(index<0 | index>size-1) throw new IndexOutOfBoundsException("越界");else{Node current=head;for(int i=0;i<=index & current!=null;i++,current=current.next){if(i==index) return (T)current.data;}return null;}}//元素定位public int locate(T element){Node current=head;for(int i=0;i<size & current!=null;i++,current=current.next){if(current.data.equals(element)) return i;}return -1;}//删除public T delete(int index){if(index<0 | index>size-1) throw new IndexOutOfBoundsException("越界");else if(index==0) {T value=head.data;head=head.next;size--;return value;}else{Node current=head;for(int i=0;i<size & current!=null;i++,current=current.next){if(i==index-1){T value=current.next.data;Node delNode=current.next;current.next=delNode.next;delNode.next=null;size--;return value;}}return null;}}public void remove(){delete(size-1);}public void clear(){head=null;tail=null;size=0;}public String toString(){StringBuilder strB=new StringBuilder("[");if(size==0) return "[]";else{for(Node current=head; current!=null;current=current.next){strB.append(current.data.toString()+", ");}return strB.toString().substring(0,strB.length()-2)+"]";}}//展示public void show(){System.out.println(this.toString());}}
测试主函数:
public class Test {public static void main(String[] args) {MyList<Object> a = new MyList<Object>();a.add(10);a.add(20);a.add(30);a.insert(15, 1);a.addToHead(5);a.show();a.delete(1);//删除第二个元素a.show();System.out.println(a.search(2));//查询第三个元素System.out.println(a.locate(20));//元素定位}}
结果:
[5, 10, 15, 20, 30][5, 15, 20, 30]202
0 0
- 手写链表(二)-使用内部类实现添加、查询、定位、插入等功能
- Java实现简单的贪吃蛇小游戏(使用线程、内部类、双向链表等)
- 安卓开发使用百度地图sdk实现定位,添加marker,城市切换等功能
- 内部类(二)
- 内部类(二)
- Unity内部类实现GPS定位
- 链表的Java实现(使用内部类作为指针的引用)
- Java 内部类(成员内部类等)初探
- Hibernate getHibernateTemplate()内部类实现查询
- 二、内部类(深入)
- java内部类(二)
- 监听器内部类(二)
- jdbc动态建表、插入记录、查询等功能(mysql)
- 内部类学习笔记(二)方法内部类
- Java内部类(二)局部内部类
- Java手写List实现添加和输出功能
- 静态链表的实现(建表,定位,删除,插入)
- 迭代器模式(四):使用内部类实现迭代器
- DELPHI FOR IOS 读取保存应用的配置信息
- Android权限大全
- JS对象
- 题目1183:守形数
- 汇总一下iOS6,iOS7的新特性
- 手写链表(二)-使用内部类实现添加、查询、定位、插入等功能
- Speex手册(二)——Speex介绍和编解码器描述1
- Android图形用户界面开发之ViewTree和DecorView详细介绍
- unicode to ansi char
- [MDIT每天一小时]活动发起倡议书
- NSTimer 详解
- JavaEE之DAO设计模式
- incompatibe types between TEncoding and IIdTextEncoding
- UVA 11280 - Flying to Fredericton SPFA变形