package com.表栈和队列;





import java.util.Iterator;

/**

 * 实现LinkedList

 * 60页

 * @author zj

 *

 * @param <T>

 */

public class MyLinkedList<T> implements Iterable<T>{



private int theSize; //集合大小



private int modCount = 0;//代表自从构造以来对链表所做的改变次数



private Node<T> beginMarker;//头节点



private Node<T> endMarker;//尾节点



/**



* 连接到前一个node和下一个Node

* @author Administrator

*

* @param <T>

*/

private static class Node<T>{

public T data;

public Node<T> prev;//上一个链

public Node<T> next;//下一个链



public Node(T d ,Node<T> p,Node<T> n){

data = d ;

prev = p ;

next = n;

}



}



public MyLinkedList(){

clear();

}



private void clear() {

// TODO Auto-generated method stub

beginMarker = new Node<T>(null, null, null);

endMarker = new Node<T>(null, beginMarker, null);

beginMarker.next = endMarker;



theSize = 0;

modCount++;

}



private int size(){

return theSize;

}





public boolean isEmpty(){

return size() == 0;

}



public boolean add(T t){

add(size(),t);

return true;

}

private void add(int idx, T t) {

// TODO Auto-generated method stub

addBefore( getNode( idx ), t );

}



private T get(int idx){

return getNode(idx).data;

}



private T set(int idx,T newVal){

Node<T> p = getNode(idx);

T  oldVal = p.data;

p.data = newVal;

return oldVal;

}

public T remove(int idx){

return remove(getNode(idx));

}

private T remove(Node<T> p) {

// TODO Auto-generated method stub

p.next.prev = p.prev;

p.prev.next = p.next;

theSize--;

modCount++;

return p.data;



}





/**

* 从下标0開始计算

* 通过获取一个新节点,然后改变指针完毕一个双链表的插入操作

* @param p

* @param t

*/

private void addBefore(Node<T> p, T t) {

// TODO Auto-generated method stub

Node<T> newNode = new Node<T>(t,p.prev,p);

newNode.prev.next = newNode;//新节点的上一个节点中指向下一节点的位置

p.prev = newNode;//插入位置节点指向上一节点的位置

theSize++;

modCount++;

}





/*

* 依据索引获取节点

* 假设索引在表的前半部分。那么将向后的方向遍历链表

* 否则将向末尾往回遍历

*/

private Node<T> getNode(int idx) {

// TODO Auto-generated method stub

Node<T> p;



if(idx < 0 || idx > size()){

throw new  IndexOutOfBoundsException();

}



if(idx < size()/2){

p = beginMarker.next;

for(int i=0;i<idx;i++){

p = p.next;

}

}else{

p = endMarker;

for(int i=size();i>idx;i--){

p = p.prev;

}

}

return p;

}





@Override

public Iterator<T> iterator() {

// TODO Auto-generated method stub

return new LinkedListIterator();

}

private class LinkedListIterator implements java.util.Iterator<T>{

private Node<T> current = beginMarker.next; //当前节点

private int expectedModCount = modCount;

private boolean okToRemove = false;



@Override

public boolean hasNext() {

// TODO Auto-generated method stub

return current!= endMarker;//当前节点是否等于最后节点

}





@Override

public T next() {

// TODO Auto-generated method stub

if(modCount != expectedModCount)

throw new java.util.ConcurrentModificationException();

if(!hasNext())

throw new java.util.NoSuchElementException();



T nextItem = current.data;

current = current.next;

okToRemove = true;

return nextItem;



}





@Override

public void remove() {

// TODO Auto-generated method stub

if(modCount != expectedModCount)

throw new java.util.ConcurrentModificationException();

if(!okToRemove)

throw new IllegalStateException();

MyLinkedList.this.remove(current.prev);

okToRemove = false;

expectedModCount++;

}



}

public static void main(String[] args) {

MyLinkedList<Integer> ml = new MyLinkedList<Integer>();

ml.add(1);

ml.add(2);

ml.add(3);

ml.add(1, 10);

for(Integer i :ml){

System.out.println(i);

}

}

}

实现简答LinkedList的更多相关文章

  1. 简答一波 HashMap 常见八股面试题 —— 算法系列(2)

    请点赞,你的点赞对我意义重大,满足下我的虚荣心. Hi,我是小彭.本文已收录到 GitHub · Android-NoteBook 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注 ...

  2. linux系统运维面试题简答

    1.     简述常用高可用技术 解答: Keepalived:Keepalived是一个保证集群高可用的服务软件,用来防止单点故障,使用VRRP协议实现.在master和backup之间通过mast ...

  3. 安装python包时遇到"error: Microsoft Visual C++ 9.0 is required"的简答

    简答 在Windows下用pip安装Scrapy报如下错误, error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall ...

  4. 【Python】安装python包时遇到"error: Microsoft Visual C++ 9.0 is required"的简答

    简答 在Windows下用pip安装Scrapy报如下错误, error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall ...

  5. mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list<对应的object>就行了啊

    mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list<对应的object>就行了啊 dao方法 public List< ...

  6. Java 实现简答的单链表的功能

    作者:林子木  博客网址:http://blog.csdn.net/wolinxuebin 參考网址:http://blog.csdn.net/sunsaigang/article/details/5 ...

  7. Docker理论简答

    Docker理论简答: 1.        介绍对docker的认识(10分) Docker是容器,容器不是docker Dockers就是一个文件夹,它欺骗操作系统说自己是一个操作系统,然后把所需要 ...

  8. 安装python包时遇到"error: Microsoft Visual C++ 9.0 is required"的简答(Python2.7)

    简答 在Windows下用pip安装Scrapy报如下错误, error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall ...

  9. linux基础简答(1)

    linux基础简答题 扇区及其4个主分区的原因 在第一个扇区中,保存着引导记录和分区信息,容量为512bytes,主引导记录(相当于MBR)446 bytes,分区表64bytes,记录每个分区信息要 ...

随机推荐

  1. 【LeetCode练习题】Minimum Depth of Binary Tree

    Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the n ...

  2. 【转】android电池(四):电池 电量计(MAX17040)驱动分析篇

    关键词:android 电池  电量计  MAX17040 任务初始化宏 power_supply 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台: ...

  3. 什么是FastCGI?

    什么是FastCGI? PHP的FastCGI使你的所有php应用软件通过mod_fastci运行,而不是mod_phpsusexec.FastCGI应用速度很快 是因为他们持久稳定.不必对每一个请求 ...

  4. JavaScript面向对象精要(一)

    数据类型 在JavaScript中,数据类型分为两类: 原始类型:保存一些简单数据,如true.5等.JavaScript共同拥有5中原始类型: boolean:布尔.值为true或false num ...

  5. Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析

    Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...

  6. ffmpeg常用参数一览

    基本选项: -formats 输出所有可用格式 -f fmt 指定格式(音频或视频格式) -i filename 指定输入文件名,在linux下当然也能指定:0.0(屏幕录制)或摄像头 -y 覆盖已有 ...

  7. 嵌套iframe中的HTML的文档解析类型

    问题:页面整个刷新时,IE11输入框显示的宽度和高度正常,对页面中的iframe部分刷新时,IE11输入框的宽度和高度就变小了. 原因:网页的头部定义了文档类型<!DOCTYPE html> ...

  8. angular controller之间通信方式

    对于日常开发中,难免会有controller之间通信需求.对于controller之间通信有两种方式可以做到. 用 Angular 进行开发,基本上都会遇到 Controller 之间通信的问题,本文 ...

  9. cisco asa5520 IOS故障恢复

    在ASA5520上误删除了IOS 把一台电脑IP 设置成192.168.2.2 255.255.255.0 把IOS的BIN文件复制到这台电脑上,并安装一个CISCO TFTP SERVER V1.1 ...

  10. 认识Java里面的Thread

    在一个特定的主线程执行的过程中,如果我们还需要在主线程的过程中插播一个线程,做其他动作.那么我们就可以利用Java的Thread类,创建一个新的线程. 一:线程简单实现的三种方式 (1)第一种创建线程 ...