手写ArrayList,LinkedList
来源:互联网 发布:最好用的安卓优化软件 编辑:程序博客网 时间:2024/06/06 03:40
虽然学习Java很长时间了,但是对数据结构一直很痛恨,更何况手写Collections之类的了,这次实在是没办法,所以看看书,上网看看别人怎么写的,扒了过来了,记个笔记方便以后复习,\(^o^)/~
ArrayList是比较好写,比较容易看懂的......
package com.juan;
public class MyArrayList<AnyType>{
private static final int DEFAULT_CAPACITY = 10;
private int theSize;
private AnyType[] theItems;
/**
* 返回ArrayList的长度
* @return
*/
public int size(){
return theSize;
}
public boolean isEmpty(){
return size() == 0;
}
public void ensureCapacity(int newCapacity){
if(newCapacity < theSize){
return;
}
AnyType[] old = theItems;
theItems = (AnyType[]) new Object[newCapacity];
for(int i = 0; i < size(); i++){
theItems[i] = old[i];
}
}
public MyArrayList(){
clear();
}
public void clear(){
theSize = 0;
ensureCapacity(DEFAULT_CAPACITY);
}
public void trimToSize(){
ensureCapacity(size());
}
public AnyType get(int idx){
if(idx < 0 || idx >= size()){
return null;
}else{
return theItems[idx];
}
}
public AnyType set(int idx, AnyType newVal){
if(idx < 0 || idx >= size()){
return null;
}else{
AnyType old = theItems[idx];
theItems[idx] = newVal;
return old;
}
}
public boolean add(AnyType x){
add(size(), x);
return true;
}
public void add(int idx, AnyType x){
if(theItems.length == size()){
ensureCapacity(size()*2+1);
}
for(int i = theSize; i > idx; i++){
theItems[i] = theItems[i - 1];
}
theItems[idx] = x;
theSize++;
}
public AnyType remove(int idx){
AnyType removedItem = theItems[idx];
for(int i = idx; i < size()-1; i++){ //为什么不是size()
theItems[i] = theItems[i + 1];
}
theSize--;
return removedItem;
}
}
-----------------------------------------------------------------------------------------------------------------------
LinkedList折磨我很久,光看代码没办法消化,我就在纸上画了画,勉强过关了
package com.juan;
public class MyLinkedList<AnyType> {
private static class Node<AnyType>{
public AnyType data;
public Node<AnyType> prev;
public Node<AnyType> next;
public Node(AnyType d, Node<AnyType> p, Node<AnyType> n){
data = d;
prev = p;
next = n;
}
}
private int theSize;
private int modCount;
private Node<AnyType> beginMarker;
private Node<AnyType> endMarker;
public MyLinkedList(){
clear();
}
public void clear(){
beginMarker = new Node<AnyType>(null, null, null);
endMarker = new Node<AnyType>(null, beginMarker, null);
beginMarker.next = endMarker;
theSize = 0;
}
public int size(){
return theSize;
}
public boolean add(AnyType x){
add(size(), x);
return true;
}
public void add(int idx, AnyType x){
addBefore(getNode(idx), x);
}
public AnyType get(int idx){
return getNode(idx).data;
}
private void addBefore(Node<AnyType> p, AnyType x){
Node<AnyType> newNode = new Node<AnyType>(x, p.prev, p);
newNode.prev.next = newNode;
p.prev = newNode;
theSize++;
modCount++;
}
private Node<AnyType> getNode(int idx){
Node<AnyType> p;
if(idx < 0 || idx > size()){
System.out.println("IndexOutOfBoundsException");
}
if(idx <= size()/2){
System.out.println(idx);
p = beginMarker.next;
for(int i = 0; i < idx; i++){
p = p.next;
}
}else{
p = endMarker;
for(int i = size(); i > idx; i--){
p = p.prev;
}
}
return p;
}
public boolean find(AnyType x){
Node<AnyType> p = beginMarker.next;
for(int i = 0; i < size(); i++){
if(p.data == x){
return true;
}
p = p.next;
}
return false;
}
/**这个方法还有点问题,打印前面多了个null,昨天实在太困了,还没来得及完善,待续......**/
public String toString(){
String s = null;
Node<AnyType> p = beginMarker.next;
for(int i = 0; i < size(); i++){
s += p.data +",";
p = p.next;
}
return s;
}
}
- 手写ArrayList,LinkedList
- 手写arrayList
- arraylist linkedlist
- ArrayList&LinkedList
- arraylist linkedlist
- ArrayList/LinkedList
- LinkedList、ArrayList
- ArrayList & LinkedList
- ArrayList、linkedList
- Java数据结构之手写LinkedList
- Vector,ArrayList与LinkedList
- 分清Vector、ArrayList、LinkedList
- ArrayList LinkedList Vector类
- ArrayList LinkedList Vector(转)
- ArrayList和LinkedList区别
- Vector, ArrayList, LinkedList
- ArrayList、Vector和LinkedList
- LinkedList、ArrayList和Vector
- Linux学习
- 在VMWare Workstation上使用RedHat Linux安装和配置Hadoop群集环境06_WordCount示例
- Erlang的hidden节点
- POJ1035Spell Checker
- Windows 下用 SourceInsight 与 Linux 协作编码
- 手写ArrayList,LinkedList
- android和 libgdx的一些资源
- Andriod Fragment---给Activity添加一个Fragment
- 过去的2011,再见,希望的2012,你好!
- Android Fragment---添加一个没有UI的Fragment
- Android Fragment---管理Fragment
- 手写ArrayStack, LinkedStack
- Android Fragment---执行Fragment事务
- Android开源代码解读のOnScrollListener实现ListActivity滚屏首字母提示