实现简答LinkedList
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的更多相关文章
- 简答一波 HashMap 常见八股面试题 —— 算法系列(2)
请点赞,你的点赞对我意义重大,满足下我的虚荣心. Hi,我是小彭.本文已收录到 GitHub · Android-NoteBook 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注 ...
- linux系统运维面试题简答
1. 简述常用高可用技术 解答: Keepalived:Keepalived是一个保证集群高可用的服务软件,用来防止单点故障,使用VRRP协议实现.在master和backup之间通过mast ...
- 安装python包时遇到"error: Microsoft Visual C++ 9.0 is required"的简答
简答 在Windows下用pip安装Scrapy报如下错误, error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall ...
- 【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 ...
- mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list<对应的object>就行了啊
mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list<对应的object>就行了啊 dao方法 public List< ...
- Java 实现简答的单链表的功能
作者:林子木 博客网址:http://blog.csdn.net/wolinxuebin 參考网址:http://blog.csdn.net/sunsaigang/article/details/5 ...
- Docker理论简答
Docker理论简答: 1. 介绍对docker的认识(10分) Docker是容器,容器不是docker Dockers就是一个文件夹,它欺骗操作系统说自己是一个操作系统,然后把所需要 ...
- 安装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 ...
- linux基础简答(1)
linux基础简答题 扇区及其4个主分区的原因 在第一个扇区中,保存着引导记录和分区信息,容量为512bytes,主引导记录(相当于MBR)446 bytes,分区表64bytes,记录每个分区信息要 ...
随机推荐
- PHP在Windows下安装配置第一步
第一步就是下载和安装PHP解释器了: 1.下载Windows版本号的PHP解释器,下载地址:官方下载 我下载的是 VC11 x64 Thread Safe 这个以下的zip包 2.下载完毕后,解压到 ...
- 【水题递归】【HDU2044】我大沙茶了
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. Input 输入数据的第一行是一个整数N,表示测试实例的个数, ...
- PropertyGrid—添加属性Tab
零.引言 PropertyGrid用来显示和编辑对象的属性,前面已经简单介绍了如何使用该控件和提供不同的属性编辑方法.前面主要讲如何使用该控件,但有时,该控件无法满足我们的需求,就需要对其进行扩展.本 ...
- Entity Framework with MySQL
Get Entity Framework: http://msdn.microsoft.com/en-us/data/ee712906 Entity Framework 6 Tools for Vis ...
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)(转载)
在CSS3中,可以利用transform功能来实现文字或图像的旋转.缩放.倾斜.移动这四种类型的变形处理,本文将对此做详细介绍. 一.旋转 rotate 用法:transform: rotate(45 ...
- 为 IIS 7.0 配置 <system.webServer>
Web.config 文件中的 system.webServer 节用于指定适用于 Web 应用程序的 IIS 7.0 设置.system.WebServer 是 configuration 节的子级 ...
- 时间的获取和转换,C#和Sql
我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...
- hdu3123GCC
Problem Description The GNU Compiler Collection (usually shortened to GCC) is a compiler system prod ...
- Hibernate学习——映射关系
学习记录 O(∩_∩)O . 如果你恰巧路过,希望你能停下脚步瞧一瞧,不足之处望指出,感激不尽~ 使用工具: 1.eclipse 2.hibernate压缩包(hibernate_4.3.11) ...
- (原)android的JNI中使用C++的类
android的JNI代码中可以调用C++的类,但是不能直接调用,要加上一个类似于接口的java类,这个类内部调用C++的类.实际上和接口类直接调用C++中的函数差不多,只是稍微复杂了一点. 1. 写 ...