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. hdu 1885 Key Task(bfs+位运算)

    题意:矩阵中'#'表示墙,'.'表示通路,要求从起点'*'到达终点'X',途中可能遇到一些门(大写字母),要想经过,必须有对应的钥匙(小写字母).问能否完成,若能,花费的时间是多少. 分析:同hdu ...

  2. [转]FFMPEG视音频编解码零基础学习方法

    在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“ ...

  3. Ant编译环境

    使用ant编译有关于C compiler(cc task)的时候,需要确认vs的环境有无配置, 否则会遇到形形色色的问题,比如各种 vs编译工具找不到的错误, 一个比较简单的解决方案,就是在执行ant ...

  4. 在Android中使用并发来提高速度和性能

    Android框架提供了很实用的异步处理类.然而它们中的大多数在一个单一的后台线程中排队.当你需要多个线程时你是怎么做的? 众所周知,UI更新发生在UI线程(也称为主线程).在主线程中的任何操作都会阻 ...

  5. JS面向对象组件(三)--面向对象中的常用属性和方法

    图片的由来看下面: 1.hasOwnProperty:看是不是对象自身下面的属性 var arr = []; arr.num = ; Array.prototype.num2 = ; //所有的数组对 ...

  6. SQLServer如何快速生成100万条不重复的随机8位数字

    最近在论坛看到有人问,如何快速生成100万不重复的8位编号,对于这个问题,有几点是需要注意的: 1.    如何生成8位随机数,生成的数越随机,重复的可能性当然越小 2.    控制不重复 3.    ...

  7. 热门Web开发方式 REST实现原理浅析

    REST 首先只是一种架构样式,不是一种标准.这点和 Ajax 类似,两者都是利用现有的成熟技术.在 REST 的定义中,一个 Web 应用总是使用固定的 URI 向外部世界呈现(或者说暴露)一个资源 ...

  8. delphi 中 image 控件加载bmp、JPG、GIF、PNG等图片的办法

    procedure TForm1.Button1Click(Sender: TObject);var  jpg: TJPEGImage; // 要use Jpeg单元begin  // 显示jpg大图 ...

  9. Chopsticks

    题意: n个数3个相邻是一组,求选k组使得,各组组内较小的两个数的差之和最小. 分析: 对于每个数选或不选的问题,dp[i][j]表前i个数选了j组得到的最小和. dp[i][j]=min(dp[i- ...

  10. C ~ C语言字节对齐

    1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...