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. 正则表达式 java版

    众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学习及使用正则表达式,便成了解决这一矛 ...

  2. HBase 系统架构

    HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型.它存储的是 ...

  3. 使用C#代码发起K2 Blackpearl流程

    转:http://www.cnblogs.com/dannyli/archive/2011/08/02/2125285.html 使用C#代码,发起一个K2的流程,其形式和链接SQL Server数据 ...

  4. android 中如何获取camera当前状态

    /** * 测试当前摄像头能否被使用 * * @return */ public static boolean isCameraCanUse() { boolean canUse = true; Ca ...

  5. Linux 安装JDK7 遇到的问题

    Error occurred during initialization of VMjava/lang/NoClassDefFoundError: java/lang/Object 如出现 unpac ...

  6. ECSide标签属性说明之<ec:column>

    <ec:column>标签 ◆ 属性: columnId描述: 单元格的id,相当于<td>的id属性 ◆ 属性: title描述: 列在列表表头里显示的名称. ◆ 属性: p ...

  7. 如何配置Drupal数据库信息?

    Drupal的数据库连接信息通过文件settings.php中的变量$databases设置.变量$databases是一个二维的数组,第一维称为key,第二维称为target.使用这种方式可以处理多 ...

  8. NewtonPrincipia_物体的运动_求向心力

    NewtonPrincipia_物体的运动_求向心力 让我们看一下十七世纪的被苹果砸中的艾萨克,是怎样推导出向心力公式的 在现在的观点看来,其中涉及到的很多没有符号表示的微分量.下面的内容只是叙述了推 ...

  9. Java中的路径问题

    Java中的路径问题 代码说明,如下: package com.merlin.test; import java.io.InputStream; public class Test { public ...

  10. Sunrise Release Version History

    Sunrise Release Version History 1.4.1.0 1.1.0.0 1.0.1.0