继前面实现ArrayList后,今天和小伙伴一起实现LinkedList,LinkedList实现我们采用双向链表来实现,在每次查找时候,如果该查找元素位于该链表的前半段,则从开始检索,如果位于链表的后半段,则从尾部开始检索。以下先贴出代码:

package com.david.duan;

import java.util.Iterator;

public class MyLinkedList implements Iterable<Student>{
//表示该链表的长度
private int theSize;
//每次链表被修改就增加此值
private int modCount;
//链表的头元素
private Node<Student> beginMarker;
//链表的尾元素
private Node<Student> endMarker;
//使用内部类来实现链表的每一个节点,每个节点有一个指向下一个元素的next,指向上一个元素的prev,以及自身的data
private static class Node<Student> {
public Node(Student data, Node<Student> prev, Node<Student> next) {
this.data = data;
this.prev = prev;
this.next = next;
}
public Student data;
public Node<Student> prev;
public Node<Student> next;
}
//链表的构造方法
public MyLinkedList () {
clear();
}
//清除链表,即使得链表的头元素指向链表的尾元素
public void clear () {
beginMarker = new Node<Student>(null, null, null);
endMarker = new Node<Student>(null, beginMarker, null);
beginMarker.next = endMarker;
}
//返回链表的长度
public int size() {
return theSize;
}
//判断链表是否为空
public boolean isEmplty() {
return size() == 0;
}
//向链表中添加元素
public boolean add(Student x) {
add(size(), x);
return true;
} public void add(int idx, Student x) {
addBefore(getNode(idx), x);
}
//获取该节点的data
public Student get(int idx) {
return getNode(idx).data;
}
//设置该节点的值
public Student set(int idx, Student newData) {
Node<Student> oldNode = getNode(idx);
Student oldData = oldNode.data;
oldNode.data = newData;
return oldData;
}
//删除该节点,并返回该节点的值
public Student remove(int idx) {
return remove(getNode(idx));
} private Student remove(Node<Student> p) {
p.prev.next = p.next;
p.next.prev = p.prev;
theSize--;
modCount++;
return p.data;
}
//执行添加
private void addBefore (Node<Student> p, Student x) {
Node<Student> newNode = new Node<Student>(x, p.prev, p);
newNode.prev.next = newNode;
p.prev = newNode;
modCount++;
}
//查找节点
private Node<Student> getNode(int idx) {
Node<Student> 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;
}
//此处类似于前面的ArrayList,用以保存并返回当前元素
@Override
public Iterator<Student> iterator() {
return new LinkedListIterator();
} private class LinkedListIterator implements java.util.Iterator<Student> { private Node<Student> current = beginMarker.next;
private int expectedModCount = modCount;
private boolean okToRemove = false;
@Override
public boolean hasNext() {
return current != endMarker;
} @Override
public Student next() {
if (modCount != expectedModCount ) {
throw new java.util.ConcurrentModificationException();
}
if(!hasNext()) {
throw new java.util.NoSuchElementException();
}
Student nextData = current.data;
current = current.next;
okToRemove = true;
return nextData;
} @Override
public void remove() {
if (modCount != expectedModCount ) {
throw new java.util.ConcurrentModificationException();
}
if(!hasNext()) {
throw new java.util.NoSuchElementException();
}
MyLinkedList.this.remove(current.prev);
okToRemove = false;
expectedModCount++;
} }
}

此处讲解不太详细的地方,欢迎大家留言探讨。

[置顶] 小伙伴们来自己实现LinkedList的更多相关文章

  1. [知了堂学习笔记]_css3特效第二篇--行走的线条&&置顶导航栏

    一.行走的线条. 效果图(加载可能会慢一点儿,请稍等...): html代码: <div class="movingLines"> <img src=" ...

  2. MySQL 上移/下移/置顶

    在编写网站系统时,难免会用到上移.下移.置顶的功能,今天小编就介绍一下我的思路. 首先,需要一张数据表: CREATE TABLE `a` ( `id` ) NOT NULL AUTO_INCREME ...

  3. css3特效第二篇--行走的线条&&置顶导航栏

    一.行走的线条. 效果图(加载可能会慢一点儿,请稍等...): html代码: <div class="movingLines"> <img src=" ...

  4. 在UWP中页面滑动导航栏置顶

    最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...

  5. WinFrom窗体始终置顶

    调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...

  6. winform窗体置顶

    winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...

  7. 自定义置顶TOP按钮

    简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...

  8. ahk之路:利用ahk在window7下实现窗口置顶

    操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...

  9. Qt中让Qwidget置顶的方法

    一般来是说窗体置顶和取消只要        setWindowFlags(Qt::WindowStaysOnTopHint);        setWindowFlags(Qt::Widget); 要 ...

随机推荐

  1. RadioButtonList控件

    在这里只写,绑定数据库数据的RadioButtonList控件: 一: 首先,先在数据库中建立一张表: 1 CREATE TABLE KK 2 ( 3 id INT, 4 [name] VARCHAR ...

  2. linux下的二进制文件的编辑和查看

    linux下的二进制文件的编辑和查看 http://blog.csdn.net/wangxiaoqin00007/article/details/6618003 一.在Linux下查看二进制文件的软件 ...

  3. java--实例成员 & 静态成员

    class run{ static String str1 = "静态变量"; String str2 = "非静态变量"; public static voi ...

  4. 05-OC多态

    目录: 一.继承的缺陷 二.为什么使用继承 三.组合和聚合 四.多态 回到顶部 一.继承的缺陷 1 提高了程序的复杂度,维护性和扩展性低 2 破坏了类的封装性 回到顶部 二.为什么使用继承 1 代码复 ...

  5. JMS开源比较

    Java开源JMS消息中间件 mom4j mom4j是一个完全实现JMS1.1规范的消息中间件并且向下兼容JMS1.0与1.02.它提供了自己的消息处理存储使它独立于关系数据与语言,所以它的客户端可以 ...

  6. cocos2d-x游戏开发系列教程-坦克大战游戏之坦克和地图碰撞的检测下

    上篇我们完成了地图的信息获取和碰撞检测,这篇我们整合到程序中. 在这之前我们改造一下Tank类,使它更加模块化,共容易理解: 1.改造后的Tank类声明如下: class Tank : public ...

  7. ios开发问题:添加库和复制其它工程文件编译错误问题

    首先添加库问题: 选择页签Build Phases->Link Binary With Libraries点+添加库 然后command+shift+k清除历史debug的垃圾 复制其它工程文件 ...

  8. java jni 编程

    最近要学习Java JNI 编程. 我使用的是的windows系统.装了一个cygwin. 根据 <JNI 编程规范和指南>. 文件网址: http://wenku.baidu.com/v ...

  9. jQuery 删除HTML元�

    jQuery使用以下两个方法来删除或是清空某个HTML元素. remove() – 删除指定的元素(包含其子元素) empty() – 清空指定元素的子元素 比如: <!DOCTYPE html ...

  10. LWP::UserAgent - Web user agent class Web 用户agent 类:

    LWPUserAgent: LWP::UserAgent - Web user agent class Web 用户agent 类: 概述: require LWP::UserAgent; my $u ...