My集合框架第一弹 LinkedList篇

package com.wpr.collection;

import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class MyLinkedList<AnyType> implements Iterable<AnyType> {
	private Node<AnyType> begin;
	private Node<AnyType> end;
	private int size;
	private int modCount;

	private static class Node<AnyType>{
		public AnyType data;
		public Node<AnyType> pre;
		public Node<AnyType> next;
		public Node(AnyType data, Node<AnyType> pre, Node<AnyType> next) {
			super();
			this.data = data;
			this.pre = pre;
			this.next = next;
		}
	}

	public MyLinkedList(){
		clear();
	}

	private void clear() {
		begin = new Node<AnyType>(null,null, null);
		end = new Node<AnyType>(null,begin,null);
		size = 0;
		modCount++;
		begin.next = end;
	}

	public int size(){
		return this.size;
	}
	public boolean isEmpty() {
		return size==0;
	}

	public boolean add(AnyType x){
		add(size(),x);
		return true;
	}

	public AnyType find(int idx){
		return getNode(idx).data;
	}

	public AnyType remove(int idx){
		return remove(getNode(idx));
	}
	/**
	 * 根据下标修改节点的值
	 * @param idx  具体下标
	 * @param p	   新的值
	 * @return  原来节点的值
 	 */
	public AnyType set(int idx,AnyType p){
		Node<AnyType> temp = getNode(idx);
		AnyType old = temp.data;
		temp.data = p;
		return old;
	}
	private AnyType remove(Node<AnyType> node) {
		node.pre.next = node.next;
		node.next.pre = node.pre;
		size--;
		modCount++;
		return node.data;
	}
	public Iterator<AnyType> iterator(){
		return new LinkedListIterator();
	}
	//内部类
	private class LinkedListIterator implements Iterator<AnyType>{
		private Node<AnyType> current = begin.next;
		private int expectedModCount = modCount;
		private boolean okToRemove = false;

		@Override
		public boolean hasNext() {
			return current != end;
		}

		@Override
		public AnyType next() {
			if(modCount!=expectedModCount){
				throw new ConcurrentModificationException();
			}
			if(!hasNext()){
				throw new NoSuchElementException();
			}
			AnyType item = current.data;
			current = current.next;
			okToRemove = true;
			return item;
		}

		@Override
		public void remove() {
			if(modCount!=expectedModCount){
				throw new ConcurrentModificationException();
			}
			if(!okToRemove){
				throw new IllegalStateException();
			}

			MyLinkedList.this.remove(current.pre);
			okToRemove = false;
			expectedModCount ++;
		}

	}
	public void add(int idx, AnyType x) {
		addBefore(getNode(idx),x);
	}
	/**
	 * 在当前节点之前加入一个一节点
	 * @param node 当前节点
	 * @param x	要加入的节点
	 */
	private void addBefore(Node<AnyType> node, AnyType x) {
		Node<AnyType> newNode = new Node<AnyType>(x, node.pre,node);
		newNode.pre.next = newNode;
		newNode.next.pre = newNode;
		size++;
		modCount++;
	}

	public Node<AnyType> getNode(int idx) {
		Node<AnyType> p;
		if(idx<0||idx>size)
			throw new IndexOutOfBoundsException();

		if(idx<size/2){
			p = begin.next;
			for(int i=0;i<idx;i++){
				p = p.next;
			}
		}else{
			p = end;
			for(int i=size;i>idx;i--){
				p = p.pre;
			}
		}
		return p;
	}
}
时间: 2024-12-13 07:35:24

My集合框架第一弹 LinkedList篇的相关文章

深入理解Java集合框架,看这篇就差不多了

Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, 和Properties这些类用来存储和操作对象组. 虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题.由于这个原因,使用Vector类的方式和使用Properties类的方式有着很大不同. 集合框架被设计成要满足以下几个目标: 该框架必须是高性能的.基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的. 该框架允许不同类型的集合,以类似的方式工作,具有高度

Java自学-集合框架 ArrayList和LinkedList的区别

ArrayList和LinkedList的区别 步骤 1 : ArrayList和LinkedList的区别 ArrayList ,插入,删除数据慢 LinkedList, 插入,删除数据快 ArrayList是顺序结构,所以定位很快,指哪找哪. 就像电影院位置一样,有了电影票,一下就找到位置了. LinkedList 是链表结构,就像手里的一串佛珠,要找出第99个佛珠,必须得一个一个的数过去,所以定位慢 步骤 2 : 插入数据 package collection; import java.u

My集合框架第二弹 二叉树的实现

package com.wpr.collection; import java.util.NoSuchElementException; public class BinarySearchTree<AnyType extends Comparable<? super AnyType>> { private static class BinaryNode<AnyType> { AnyType element; BinaryNode<AnyType> left;

浅入深出之Java集合框架(下)

Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. 温馨提醒:建议从(上)开始看哦~ 目 录 浅入深出之Java集合框架(上) 浅入深出之Java集合框架(中)   浅入深出之Java集合框架(下) 前 言 在<浅入深出之Java集合框架(中) >中介绍了Map接口的基本操作.使用的示例是在<浅入深出之Java集合框架(上)>中的模拟学

手写集合框架LinkedList实现篇

<手写集合框架>LinkedList篇 嘿嘿嘿,拖延症犯了,这几天不怎么想写代码,所以趁没事干就写写了.进入正文 还是老套路嘻嘻嘻,因为我之前写了那个准备篇,对node已经描述的从差不多了,所以我就不过多描述了. 直接贴完代码强行解释一波 一.定义接口 public interface newList<T> { //定义泛型,因为Object可以存储任意类型,有时候我们需要 //用泛型 代替Object public void add(Object object); //集合的添加

第10篇-JAVA 集合框架-JAVA 泛型

第10篇-JAVA 集合框架-JAVA 泛型 每篇一句 :所有的不甘,都是因为还心存梦想 初学心得: 不是每件事都注定会成功,但是每件事都值得一试 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-15| JAVA 集合框架/JAVA 泛型 ] 1.JAVA 集合框架概念 通俗的说,集合就是一个存放数据的容器,准确的说,就是放数据对象引用的容器 数组和集合都是容器,有何不同? 数组长度固定,集合长度可变 数组只能存放相同类型的数据,集合可以存放不同类型的数据 数组可存放简单数据

JAVA学习第三十五课(常用对象API)- 集合框架(三)—Vector、LinkedList、ArrayList集合演示

集合框架构成图 摘自百度图片 一.Vector集合 演示 虽然Vector已经不常用了,但是还是要了解一下其中的方法 import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Vector

Python Web框架【Django框架第一篇基础】

Django框架第一篇基础[DjangoMTV模式] 老师博客[www.cnblogs.com/yuanchenqi/articles/6811632.html] 同学博客:http://www.cnblogs.com/haiyan123/p/7701412.html Django官网:https://www.djangoproject.com/download/ 一.安装Django DjangoMTV模式 Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代

JAVA常用集合框架用法详解基础篇一之Colletion接口

首先,在学习集合之前我们能够使用的可以存储多个元素的容器就是数组. 下面举几个例子主要是引出集合类的: 1.8,4,5,6,7,55,7,8  像这样的类型相同的可以使用数组来存储,本例可以用int[] arr来存储. 2."zhnagsan",true,68 像这样的可以使用StringBuilder或者StringBuffer来存储,但最终需要使用.toString()的方法转换成字符串才可以使用.即 变为:"zhnagsantrue68". 3."李