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. python练习程序(c100经典例8)

    题目: 输出9*9口诀. for i in range(1,10): for j in range(1,i+1): print str(j)+"*"+str(i)+"=& ...

  2. The Robust Fuzzy C-means

    摘要: 基于FCM的在图像处理方面对噪声敏感的不足,本文通过引入空间模型建立空间模糊C均值聚类提高算法的鲁棒性,在此基础上,结合抑制式对算法进一步优化.最后,给图像加不同程度的噪声,通过MATLAB编 ...

  3. PPTP模式跟L2TP模式有什么不同

    使用VPN的时候经常会看到商家说支持PPTP模式和L2TP模式,但是许多朋友都不知道有什么区别,该用哪一个,下面给你们讲讲: 1).PPTP协议是点对点隧道协议:其将控制包与数据包分开,控制包采用TC ...

  4. CentOS安装tomcat

    一.下载Tomcat 1..进入Tomcat官网:http://tomcat.apache.org/ 左侧选择相应的版本 点击Tomcat 6.0后 点击tar.gz下载apache-tomcat-6 ...

  5. JAVA中的成员变量与局部变量

    package com.imooc; //1.定义一个类 public class Telphone { //2.属性(成员变量)有什么 float screen; float cpu; float ...

  6. python基础之使用os.system来执行系统命令

    今天我们来尝试使用python 的os.system来执行系统命令 可以使用如下方法: import osprint os.system('ping www.baidu.com') 输出的结果是:64 ...

  7. windows7操作系统64位安装ArcSDE10.1和Oracle11g

    安装环境如下: Oracle11g R2 64位服务端Oracle11g R2 32位客户端(管理员,第二项)ArcSDE10.1 for Oracle11g SDE数据库可由其它机器安装Arcata ...

  8. 软件测试——boost单元测试 C++

    分类: 1. 下载安装Boost 2. 在vs2010 中设置   工具->选项->vc++目录   设置包含文件目录:找到解压的boost文件夹eg:C:\boost_1_43_03. ...

  9. 【leetcode】Find Minimum in Rotated Sorted Array II JAVA实现

    一.题目描述 Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed ...

  10. 【LeetCode 236】Lowest Common Ancestor of a Binary Tree

    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...