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;
}
}

在以上的链表结构基础上,讨论链表的其他操作 1.链表的反转   提供一种方法:就地反转   begin-->1-->2-->3-->end   begin-->2-->1-->3-->end   begin-->3-->2-->1-->end   代码如下:  

	/**
* 反转链表
* @return
*/
public MyLinkedList reverse(){
Node<AnyType> cur = begin.next;
if(cur==end)
return this;
Node<AnyType> curNext; while(cur.next!=end){
curNext = cur.next;
curNext.next.pre = cur;
cur.next =curNext.next;
curNext.next = begin.next;
curNext.pre = begin;
begin.next = curNext;
curNext.next.pre = curNext;
}
return this;
} public static void main(String[] args) {
MyLinkedList<Integer> l = new MyLinkedList<>();
for(int i=0;i<10;i++){
l.add(i);
}
l = l.reverse();
for(Integer i:l){
System.out.print(i+"\t");
}
}

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

  1. Java 集合框架综述,这篇让你吃透!

    一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和 ...

  2. Java——集合框架之ArrayList,LinkedList,迭代器Iterator

    概述--集合框架 Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类).所有抽象出来的数据结构和操作(算法)统称为Java集合框架(Java Collection ...

  3. 集合框架-ArrayList,Vector,Linkedlist

    // ClassCastException 报错,注意,千万要搞清楚类型 * Vector的特有功能: * 1:添加功能 * public void addElement(Object obj) -- ...

  4. Java学习笔记——浅谈数据结构与Java集合框架(第三篇、Map)

    桃李春风一杯酒,江湖夜雨十年灯 --寄黄几复 之前图上写错了,是Hashtable类.t是小写的,它是个很古老的类,以至于命名都没有那么规范.. HashMap HashMap就是存储key-valu ...

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

    ArrayList和LinkedList的区别 步骤 1 : ArrayList和LinkedList的区别 ArrayList ,插入,删除数据慢 LinkedList, 插入,删除数据快 Arra ...

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

    package com.wpr.collection; import java.util.NoSuchElementException; public class BinarySearchTree&l ...

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

    Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...

  8. 【深入理解Java集合框架】红黑树讲解(上)

    来源:史上最清晰的红黑树讲解(上) - CarpenterLee 作者:CarpenterLee(转载已获得作者许可,如需转载请与原作者联系) 文中所有图片点击之后均可查看大图! 史上最清晰的红黑树讲 ...

  9. JAVA基础第五章-集合框架Map篇

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

随机推荐

  1. singleton单例模式

    单例设计模式 单例设计模式概述    单例模式就是要确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供    优点:    在系统内存中只存在一个对象,因此可以解决系统资源,对于一些需要频繁 ...

  2. MySQL的性能调优工具:比mysqlreport更方便的tuning-primer.sh

    年初的时候收藏过一篇关于mysqlreport的报表解读,和内置的show status,和show variables相比mysqlreport输出一个可读性更好的报表:但Sundry MySQL提 ...

  3. for...else循环

    如果for循环完整结束,无break打断循环,那么执行else里面的内容,否则不执行. while True: n = raw_input('>') for x in n: if x == 'f ...

  4. Hive技术文档

    Hive是什么? Hive是蜂房的意思,为什么hadoop上的这层数据仓库叫Hive? 因为生物学上蜂房是一个结构相当精良的建筑,取名Hive足见则个数据仓库在数据存储上也是堪称精良的.Hive是Fa ...

  5. Android使用绘图Path总结

    Path作为Android中一种相对复杂的绘图方式,官方文档中的有些解释并不是很好理解,这里作一个相对全面一些的总结,供日后查看,也分享给大家,共同进步. 1.基本绘图方法 addArc(RectF ...

  6. Android 适配多种ROM的快捷方式

    快捷方式 应该来说 很多人都做过,我们就来看一下基本的快捷方式 是怎么实现的,会有什么问题? 首先 肯定要获取权限: <!-- 添加快捷方式 --> <uses-permission ...

  7. Javascript模块化编程(三):require.js的用法 (转)

    转自:http://my.oschina.net/u/1390066/blog/213769 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载 ...

  8. Jquery 设置style:display 通过ID隐藏区域

    $("#id").css('display','none'); $("#id").css('display','block'); 或 $("#id&q ...

  9. C#中的枚举类型(enum type)

    ylbtech 原文 C#中的枚举类型(enum type) 概念 枚举类型(enum type)是具有一组命名常量的独特的值类型.在以下示例中: enum Color { Red, Green, B ...

  10. RPC调用框架比较分析

    什么是RPC: RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 简言之,RPC ...