Java数据结构(三):线性表之单链表

链式存储结构存储线性表的方法是把存放数据元素的结点用指针域构造成链。指针是指向下一个节点的引用,由数据元素域和一个或若干个指针域组成的一个类称之为结点。链式存储结构的特点是数据元素间的逻辑关系表现在节点的链接关系上。

本例中实现的链表结构都是带头结点的。具体代码如下:【详见:SingleLinkedList.java

package datastructure.linear.linked;

import datastructure.exception.StructureException;
import datastructure.linear.AbstractList;

/**
 * @Description 单链表
 * @author mastery
 * @Date 2015年6月30日下午6:11:17
 * @param <T>
 */
public class SingleLinkedList<T> extends AbstractList<T> {

    class Node<T1> {

        T1 element;
        
        Node<T1> next;
        
        public Node(Node<T1> next) {
            super();
            this.next = next;
        }

        public Node(T1 element, Node<T1> next) {
            super();
            this.element = element;
            this.next = next;
        }

        @Override
        public String toString() {
            return element.toString();
        }
    }
    
    
    /**
     * 头结点,该结点没有参数值,只是指向第一个元素的结点
     */
    private Node<T> head;
    
    /**
     * 当前的结点
     */
    private Node<T> currentNode;
    
    public SingleLinkedList() {
        head = currentNode = new Node<T>(null);
        size = 0;
    }

    /**
     * 得到当前下标对应的结点
     * @param index
     * @throws StructureException
     */
    public void indexNodeToCurrent(int index) throws StructureException {
        currentNode = head;
        if(index < -1 || index > size -1) {
            throw new StructureException("index参数异常!");
        }
        if(index == -1) {
            return ;
        }
        currentNode = head.next;
        int j = 0 ; 
        while(currentNode != null && j < index) {
            currentNode = currentNode.next;
            j++;
        }
    }
    
    @Override
    public void insert(int index, T t) throws StructureException {
        if(index < 0 || index > size) {
            throw new StructureException("index参数异常!");
        }
        // 得到当前下标的上一个结点
        indexNodeToCurrent(index-1);
        // 将新元素生成结点插入到当前结点下
        currentNode.next = new Node<T>(t , currentNode.next);
        size++;
    }

    @Override
    public void delete(int index) throws StructureException {
        if(isEmpty()) {
            throw new StructureException("链表为空");
        }
        if(index < 0 || index > size) {
            throw new StructureException("index参数异常");
        }
        indexNodeToCurrent(index-1);
        Node<T> twoNextNode = currentNode.next.next;
        currentNode.next = twoNextNode;
        size--;
    }

    @Override
    public T get(int index) throws StructureException {
        if(isEmpty()) {
            throw new StructureException("链表为空");
        }
        if(index < 0 || index > size) {
            throw new StructureException("index参数异常!");
        }
        indexNodeToCurrent(index);
        return currentNode.element;
    }

}

单链表的插入和删除操作的时间效率分析方法和顺序表的插入和删除操作的时间效率分析方法类同,差别是单链表的插入和删除操作不需移动数据元素,只需比较数据元素。
要说明的是,虽然单链表插入和删除操作的时间复杂度与顺序表插入和删除操作的时间复杂度相同,但是,顺序表插入和删除操作的时间复杂度指的是移动数据元素的时间复杂度,当数据元素占据的内存空间比较大时,这要比单链表插入和删除操作比较数据元素花费的时间大一个常数倍。另外,单链表求数据元素个数操作的时间复杂度为O(n).

与顺序表相比,单链表的主要有点是不需要预先确定数据元素的最大个数,插入和删除时不需要移动元素;主要缺点三每个结点中要有一个指针域,因此,空间单元利用效率不高。此外,单链表操作的算法比较复杂。

测试类如下:

package datastructure.linear.linked;

import static org.junit.Assert.*;

import org.junit.Test;

import datastructure.exception.StructureException;
import datastructure.linear.List;
import datastructure.linear.linked.SingleLinkedList;

public class SingleLinkedListTest {

    @Test
    public void testSingleLinkedList() throws StructureException {
        List<Integer> list = new SingleLinkedList<Integer>();
        for(int i = 0 ; i < 10 ; i ++) {
            list.insert(i, i+1);
        }
        list.delete(0);
        for(int i = 0 ; i < list.size() ; i++) {
            System.out.print(list.get(i) + "   ");
        }
    }

    @Test
    public void testIndexNodeToCurrent() {
        fail("尚未实现");
    }

    @Test
    public void testInsert() {
        fail("尚未实现");
    }

    @Test
    public void testDelete() {
        fail("尚未实现");
    }

    @Test
    public void testGet() {
        fail("尚未实现");
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • 本文内容取自于小甲鱼的数据结构与算法。http://www.jianshu.com/p/230e6fde9c75 ...
    阿阿阿阿毛阅读 2,892评论 0 7
  • 1.线性表的定义 线性表:零个或多个数据元素的有限序列序列:也就是说元素之间是有顺序的,若元素存在多个,则第一个元...
    e40c669177be阅读 2,058评论 6 15
  • 前言 什么是线性表?线性表的两大存储结构是什么?各种存储结构是如何实现存取、插入删除等操作的?本篇主要解答了这几个...
    JonyFang阅读 1,550评论 4 17
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,444评论 1 3
  • 完整代码需结合前面一篇顺序表数据结构学习-线性表之顺序表各种操作网易云课堂小甲鱼课程链接:数据结构与算法 线性表的...
    NotFunGuy阅读 9,179评论 0 9