Java数据结构--链表

不懂的先看一下这个百度文库资料http://wenku.baidu.com/link?url=sBTDm0r0or_eLyZPHnsGs5mlnKYKtzuX9FveJ-nguoQcFPM-ZjWauNFP0P2cvh7Qx-UZToPFHMzoGT0mB92rza5LkHT78FMzPIUaKqWKnNC

看懂资料在看一下下面的东西

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。对于每个节点来说,除了存储其本身的信息(数据值)之外,还需存储一个指示其直接后继的结点的引用。存储数据元素信息的部分称为数据域 ,存储直接后继结点引用的部分成为指针域 。

优点——增、删速度快。

缺点——不能随机访问。

package ds.linerlist;
/**
 * 结点类,包含结点的数据和指向下一个节点的引用
 * @author Bao Yiming
 * @param <E>
 */
class Node<E> {
    private E e;
    private Node<E> next = null;
    Node() {
    }
    Node(E e) {
        this.e = e;
    }
    public void setNext(Node<E> next) {
        this.next = next;
    }
    public Node<E> getNext() {
        return next;
    }
    public E getValue() {
        return e;
    }
    public void setValue(E e) {
        this.e = e;
    }
    @Override
    public String toString() {
        return "" + e;
    }
}
/**
 * 单链表的实现
 * @author Bao Yiming
 * @param <E>
 */
public class LinkedList<E> {
    private Node<E> head = null; // 每个链表都存有一个空值的头结点。
    private Node<E> tail = null; // 链表的最后一个结点,尾结点。
    private int size = 0; // 当前链表中的节点数目。
    /**
     * 建立一个空链表(建立其头结点)。
     */
    LinkedList() {
        head = new Node<E>();
        tail = head;
    }
    /**
     * 在链表的尾部插入数据
     * @param e 待插入的数据
     * @return
     */
    public boolean add(E e) {
        Node<E> node = new Node<E>(e); // 将要插入的值封装成一个节点。
        tail.setNext(node); // 将待插入结点放到尾结点的下一个结点。
        tail = tail.getNext(); // 将新增加的结点设为尾节点。
        ++size; // 链表大小增1。
        return true;
    }
    /**
     *
     * @param index 待插入的位置
     * @param e 待插入的元素
     * @return
     */
    public boolean insert(int index, E e) {
        validateIndex(index);
        Node<E> newNode = new Node<E>(e); // 将要插入的值封装成一个节点。
        Node preNode = getNode(index - 1);
        newNode.setNext(preNode.getNext());
        preNode.setNext(newNode);
        return true;
    }
    /**
     * 获取指定位置的结点
     * @param index 欲获取结点的下标
     */
    private Node<E> getNode(int index) {
        validateIndex(index);
        Node<E> node = head;
        for (int p = 0; p <= index; ++p) {
            node = node.getNext();
        }
        return node;
    }
    /**
     * 获取指定位置的结点的值
     * @param index 欲获取值的结点的下标
     * @return
     */
    public E get(int index) {
        validateIndex(index);
        Node<E> node = getNode(index);
        return node.getValue();
    }
    /**
     * 验证下标值是否合法,非法时抛出异常。
     * @param index 待验证的下标值
     */
    private void validateIndex(int index) {
        if (index < 0 || index > size) {
            throw new RuntimeException("无效的下标:" + index);
        }
    }
    /**
     * 删除指定位置的结点
     * @param index 待删除结点的下标
     * @return
     */
    public boolean delete(int index) {
        Node<E> curNode = null;
        if (0 == index) {
            curNode = head.getNext();
            Node<E> nextNode = curNode.getNext();
            head.setNext(nextNode);
        } else {
            validateIndex(index);
            curNode = getNode(index); // 获取待删除节点。
            Node<E> preNode = getNode(index - 1); // 获取待删除节点的前一个结点。
            // 将待删除节点的前一个结点的下一个结点指向待删除节点的下一个结点。
            preNode.setNext(curNode.getNext());
        }
        curNode.setNext(null); // 将待删除节点的下一结点置空。
        return true;
    }
    /**
     * 设置指定位置结点的值。
     * @param index 待设置值的结点的下标
     * @param e
     */
    public void set(int index, E e) {
        validateIndex(index);
        Node<E> node = getNode(index);
        node.setValue(e);
    }
    /**
     * 获取链表的大小。
     * @return
     */
    public int size() {
        return size;
    }
    @Override
    public String toString() {
        String str = "";
        Node<E> node = head;
        while (node != tail) {
            str += (" " + node.getNext().getValue());
            node = node.getNext();
        }
        return str;
    }
}

转载地址:http://blog.csdn.net/baoyiming1991/article/details/6266147

数据结构的Java实现——栈和队列

栈(Stack)作为一个先进后出(FILO) 的线性结构,只支持在栈顶的插入和弹出。

队列(Queue)作为一个先进先出(FIFO) 的线性结构,支持在队首获取元素,在对尾插入元素。

栈的实现:

package ds.linerlist;
/**
 * 栈的实现
 * @param <E>
 * @author <a href="mailto:[email protected]" mce_href="mailto:[email protected]">Bao Yiming</a>
 */
public class Stack<E> {
    private Object[] data = null;
    private int capacity; // capacity: 栈的容量
    private int top; // top: 栈顶指针

    Stack() {
        this(10);
    }
    /**
     * 初始化栈,声明保存数据的数组大小。
     * @param initialSize  栈的初始化大小
     */
    Stack(int initialSize) {
        if (initialSize >= 0) {
            this.capacity = initialSize;
            data = new Object[initialSize];
            top = 0;
        } else {
            throw new RuntimeException("初始化大小不能小于0:" + initialSize);
        }
    }
    /**
     * 判断栈是否为空
     * @return
     */
    boolean empty() {
        return top == 0 ? true : false;
    }
    /**
     * 获取栈顶元素的内容,但是不弹出
     * @return
     */
    E peek() {
        return (E) data[top - 1];
    }
    /**
     * 弹出栈顶元素
     * @return
     */
    E pop() {
        E e = (E) data[top - 1];
        --top;
        return e;
    }
    /**
     * 在栈顶插入元素
     * @param e 待插入的元素
     * @return
     */
    boolean push(E e) {
        ensureCapacity();
        data[top] = e;
        ++top;
        return true;
    }
    /**
     * 检查存储数据的数组容量,如果数组已经满,则扩充容量;否则不操作。
     */
    private void ensureCapacity() {
        int index;
        if (top == capacity) {
            capacity *= 2;
            Object[] newData = new Object[capacity];
            for (index = 0; index < top; ++index) {
                newData[index] = data[index];
            }
            data = newData;
        }
    }
    @Override
    public String toString() {
        String str = "";
        for (int index = 0; index <= top - 1; ++index) {
            str += (data[index] + " ");
        }
        return str;
    }
}

队列的实现

package ds.linerlist;
/**
 * 队列的实现
 * @param <E>
 * @author <a href="mailto:[email protected]" mce_href="mailto:[email protected]">Bao Yiming</a>
 */
public class Queue<E> {
    Object[] data = null;
    private int capacity; // capacity: 队的容量
    private int tail; // tail: 队尾指针
    /**
     * 初始化为声明大小,则设置为10。
     */
    Queue() {
        this(10);
    }
    /**
     * 初始化队列,声明保存数据的数组大小。
     * @param initialSize 队列的初始化大小
     */
    Queue(int initialSize) {
        if (initialSize >= 0) {
            this.capacity = initialSize;
            data = new Object[initialSize];
            tail = 0;
        } else {
            throw new RuntimeException("初始化大小不能小于0:" + initialSize);
        }
    }
    /**
     * 判断队列是否为空
     * @return
     */
    public boolean empty() {
        return tail == 0 ? true : false;
    }
    /**
     * 在队尾插入元素
     * @param e 待插入的元素
     * @return
     */
    public boolean add(E e) {
        ensureCapacity();
        data[tail] = e;
        ++tail;
        return true;
    }
    /**
     * 获取队首的元素内容,但不将该元素出队。
     * @return
     */
    public E peek() {
        return (E) data[0];
    }
    /**
     * 将队首元素出队。
     * @return
     */
    public E poll() {
        E e = (E) data[0];
        for (int index = 1; index < tail; ++index) {
            data[index - 1] = data[index];
        }
        data[tail - 1] = null;
        --tail;
        return e;
    }
    /**
     * 检查存储数据的数组容量,如果数组已经满,则扩充容量;否则不操作。
     */
    private void ensureCapacity() {
        int index;
        if (tail == capacity) {
            capacity *= 2;
            Object[] newData = new Object[capacity];
            for (index = 0; index < tail; ++index) {
                newData[index] = data[index];
            }
            data = newData;
        }
    }
    @Override
    public String toString() {
        String str = "";
        for (int index = 0; index < tail; ++index) {
            if (data[index] != null) {
                str += (data[index] + " ");
            }
        }
        return str;
    }
}
时间: 2024-07-30 23:45:58

Java数据结构--链表的相关文章

java数据结构链表(纯面向对象的方式)

//Node.java //LinkedList.java _____ //测试类 [lcy, haha]    1  lcy 删除的对象是 1[lcy, haha] lcy

Java数据结构——链表

<1>链表 <2>引用和基本类型

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

Java数据结构和算法(七)——链表

前面博客我们在讲解数组中,知道数组作为数据存储结构有一定的缺陷.在无序数组中,搜索性能差,在有序数组中,插入效率又很低,而且这两种数组的删除效率都很低,并且数组在创建后,其大小是固定了,设置的过大会造成内存的浪费,过小又不能满足数据量的存储. 本篇博客我们将讲解一种新型的数据结构——链表.我们知道数组是一种通用的数据结构,能用来实现栈.队列等很多数据结构.而链表也是一种使用广泛的通用数据结构,它也可以用来作为实现栈.队列等数据结构的基础,基本上除非需要频繁的通过下标来随机访问各个数据,否则很多使

java数据结构:单链表常见操作代码实现

一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashMap等集合的底层结构都是链表结构.链表以结点作为存储单元,这些存储单元可以是不连续的.每个结点由两部分组成:存储的数值+前序结点和后序结点的指针.即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作. 单链表结构: Java中单链表采用No

Java数据结构之链表的原理及LinkedList的部分源码剖析

一.为什么要学习数据结构? 做为一名程序员,不管你是用什么编程语言,数据结构是取底层的东西.就相当于盖楼的地基一样,地基做不好,上边再好也没有用. 在高级语言中,一般会对这些基础的数据结构进行封装,我们学要学习这些基础的东西吗? 当然是的,只有知道这些基础的东西,我们才能更好地使用语言封装好的api.举个最简单的例子,在Java中,List的实现类有ArrayList,LinkedList,Vector,你知道在什么情况下用哪个效率最高吗?只有知道其底层源才能更好地利用. 如何学习数据结构? 可