实现简答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,记录每个分区信息要 ...
随机推荐
- Eclipse SVN插件的帐号、password改动
问题描写叙述: Eclipse的SVN插件Subclipse做得非常好,在svn操作方面提供了非常强大丰富的功能.但到眼下为止,该插件对svn用户的概念极为淡薄,不但不能方便地切换用户,并且一旦用户的 ...
- 多点触控插件Hammer.js
插件描述:Hammer.js是一个开源的,轻量级的javascript库,它可以在不需要依赖其他东西的情况下识别触摸,鼠标事件. 使用方法: <script src=<span class ...
- Ubuntu亮度无法调节或调节无法保存的问题
装了搜狗输入法之后,系统设置里面的很多软件都没有了.以前屏幕太亮在电源里面可以调节,现在不行了.没办法,只能找其他的办法了. 在网上查了很多资料,经自己的实验,找到了一个成功的方法. 首先进入 /sy ...
- Windows下配置sphinx+reStructuredText详解
最近有朋友想在windows下做个人笔记,没有找到顺手的工具,问我有什么好的工具推荐.正好前两天在网上看到一款做文档的利器sphinx+reStructText,当时在ubuntu下搭了下环境试了试, ...
- Android Studio Errors
1.The import org.apache.http.client; tip: cannot be resolved; resolve: add this line in build.gradle ...
- 四个常用.NET的SqlHelper的方法
至于我为什么要写这篇文章,也许很多人觉得网上大把的sqlhelper的封装类,的确,网上是有很多,我也看过网上很多的版本,但是我发现大多数都是代码生成器生成的,比如动软.CodeSmith等生成的,其 ...
- Oracle 中的Userenv()
1.USEREVN() 返回当前用户环境的信息,opt可以是:ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZ ...
- CDZSC_2015寒假新人(1)——基础 e
Description Julius Caesar lived in a time of danger and intrigue. The hardest situation Caesar ever ...
- Go语言中怎样判断数据类型_不懂的木匠_新浪博客
要判断数据类型,可以用Go的空接口: 建一个函数t 设置参数i 的类型为空接口,空接口可以接受任何数据类型 func t(i interface{}) { //函数t有一个参数i switch i ...
- 已知要闪回的大致时间使用基于as of scn的闪回查询
基本判断出要恢复误操作的dml的时间可以使用如下的方法进行数据的恢复: example: 一.创建test表 -------create table flashback_asof------ crea ...