java数据结构和算法(线性表)

来源:互联网 发布:家谱制作软件 编辑:程序博客网 时间:2024/05/17 22:10

线性表的定义:

零个或多个数据元素的有限序列。

元素之间是有顺序的,如元素多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素有且只有一个前驱和后继。


线性表的抽象数据类型


线性表的顺序存储结构

是指用一段地址连续的存储单元依次存储线性表中的元素。使用一维数组来实现。


顺序存储结构的优缺点


线性表的链式存储结构



单链表的实现

单链表的第一个节点前附设一个节点,称为头节点。头节点的数据域不存储任何信息。




package cn.xyc.dataStructure.link;/** *  * 描述:链表接口 *  * <pre> * HISTORY * **************************************************************************** *  ID   DATE           PERSON          REASON *  1    2016年10月3日        80002253         Create * **************************************************************************** * </pre> *  * @author 蒙奇·d·许 * @since 1.0 */public interface ILink<T> {/** * 在尾部添加节点 *  * @param node * @return */boolean addToTail(T node);/** * 在index处添加一个节点 *  * @param index * @param node * @return */boolean insert(int index, T node);/** * 得到index的上一个节点 *  * @param index * @return */Node<T> getPreNode(int index);}

package cn.xyc.dataStructure.link;/** *  * 描述:链表节点 *  * <pre> * HISTORY * **************************************************************************** *  ID   DATE           PERSON          REASON *  1    2016年10月3日        80002253         Create * **************************************************************************** * </pre> *  * @author 蒙奇·d·许 * @since 1.0 */public class Node<T> {private T value = null;// 数据项private Node<T> next = null;// 下一节点指针public Node() {}public Node(T value, Node<T> next) {this.value = value;this.next = next;}public T getValue() {return value;}public void setValue(T value) {this.value = value;}public Node<T> getNext() {return next;}public void setNext(Node<T> next) {this.next = next;}}

package cn.xyc.dataStructure.link;/** *  * 描述:单链表 *  * <pre> * HISTORY * **************************************************************************** *  ID   DATE           PERSON          REASON *  1    2016年10月3日        80002253         Create * **************************************************************************** * </pre> *  * @author 蒙奇·d·许 * @since 1.0 */public class LinkedList<T> implements ILink<T> {private Node<T> headNode = null;// 每个链表都存在一个空值头节点private Node<T> tailNode = null;// 尾节点private int size = 0;// 链表的长度// 初始化链表public LinkedList() {// 建立头部节点headNode = new Node<T>();}@Overridepublic boolean addToTail(T e) {Node<T> node = new Node<T>();node.setValue(e);if (size == 0) {headNode.setNext(node);}tailNode.setNext(node);tailNode = node;// 将新加的节点设置为尾节点size++;return true;}@Overridepublic boolean insert(int index, T node) {Node<T> n = this.getPreNode(index);// 得到上一个节点// 将下一个节点设为上一个节点的下一个节点Node<T> addNode = new Node<>(node, n.getNext());// 将上一个节点的下一个节点设为本节点n.setNext(addNode);// 节点的数量加1// 节点的数量return false;}@Overridepublic Node<T> getPreNode(int index) {// 判断角标是否越界validateIndex(index);if (index == 0) {// 若插入位置为第一,那么就返回头return headNode;}// 得到头Node<T> node = headNode;for (int i = 0; i <= index - 1; i++) {node = headNode.getNext();}return node;}/** * 验证下标值是否合法,非法时抛出异常。 *  * @param index *            待验证的下标值 */private void validateIndex(int index) {if (index < 0 || index > size) {throw new RuntimeException("无效的下标:" + index);}}}


单链表和顺序存储结构的优缺点:



静态链表

让数组的元素都是由两个数据域组成,data和cur。也就是说,数组的每个下标都对应一个data和cur,data用来存放数据元素,游标cur相当于单链表的next指针,存放该元素的后继在数组中的下标。这种用数组描述链表就是静态链表。也叫做游标实现法。

循环链表

将单链表中终端节点指针端由空指针改为指向头节点,就是整个单链表形成一个环,这种头尾相接的单链表称为单循环链表。


双向链表

是在单链表的每个结点中,再设置一个指向其前驱结点的指针域,所以在双向链表中都有两个指针域,一个指向前驱,一个指向后继。



0 0