package com.test.ds.linkedlist;

public class LinkedList {

long count;
    Node head;

public LinkedList() {

count = 0;

}

public void add(Object value) {
        Node newNode = new Node(value);
        if (head == null) {
            // 如果链表为空,则直接将头指针指向newNode
            head = newNode;
        } else {
            // 如果链表不为空,则在末尾节点后增加节点
            getNodeByIndex(count - 1).next = newNode;

}
        count++;

}

public Node getNodeByIndex(long index) {
        if (index < 0 || index >= count) {
            throw new IndexOutOfBoundsException("超出链表最大索引了");

}
        Node searchNode = head;
        // 注意i的范围,搜索的时候
        // i不能大于或等于index,因为当index=count-1时候,searchNodex.next肯定是为null
        // ,会造成NullPointerException
        for (long i = 0; i < index; i++) {
            searchNode = searchNode.next;

}

return searchNode;

}

public void removeAt(long index) {
        if (index < 0 || index >= count) {
            throw new IndexOutOfBoundsException("超出链表最大索引了");

}
        // 删除头结点
        if (0 == index) {
            head = head.next;
        } else {

// //先找到index 的前驱节点
            Node preNode = getNodeByIndex(index - 1);
            preNode.next = preNode.next.next;
        }
        count--;

}

/**
     * 在指定索引处加入节点
     * 
     * @param index
     * @param value
     */
    public void insert(int index, Object value) {
        Node tempNode;
        if (0 == index) {
            if (null == head) {
                head = new Node(value);
            } else {
                 tempNode = new Node(value);
                 tempNode.next =  head;
               //插入的节点成为了头节点
                 head = tempNode;
                 
            }
        }else{
        //找到节点index的前驱节点
        Node preNode = getNodeByIndex(index-1);
        tempNode = new Node(value);
        tempNode.next = preNode.next;
        preNode.next = tempNode;
        
        
        }
        count++;
    }

private class Node {
        Object data;
        Node next;

public Node(Object value) {
            this.data = value;

}

}

public long size() {

return count;
    }

@Override
    public String toString() {
        Node tempNode = head;
        StringBuffer sb = new StringBuffer();
        while (tempNode != null) {

sb.append("\t" + tempNode.data.toString());
            tempNode = tempNode.next;
        }
        return sb.toString();
    }

public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        
        System.out.println("空链表中加入1,2,3,4后:"+list.toString());
        
        list.removeAt(3);
        list.removeAt(2);
        list.removeAt(1);

System.out.println("移除位置3,2,1上的数据后:"+list.toString());

list.insert(1, 2);
        list.insert(2, 3);
        list.insert(3, 4);
        System.out.println("在位置1,2,3上插入数据后:"+list.toString());

}

}

转载于:https://www.cnblogs.com/ChrisWang/archive/2009/09/01/Data-Structure-Review-Java-Single-LinkedList.html

数据结构复习:单链表相关推荐

  1. 数据结构:单链表中在P结点前插入S结点

    标题:数据结构:单链表中在P结点前插入S结点 在数据结构的习题中偶然看到了一个题目 已知在单链表中P不是首元结点也不是尾元结点,在P结点前插入S结点 #include<stdio.h> # ...

  2. 基本的数据结构:单链表(Singly Linked List)

    一.基本的数据结构:单链表(Singly Linked List) 什么是单链表? 下面是百度百科给出的官方解释: 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表 ...

  3. Java数据结构——用单链表编写一个简易通讯录

    Java数据结构--用单链表编写一个简易通讯录 1.定义线性表的抽象数据类型(接口) 2.定义单链表的结点Node类 3.定义数据域中的联系人Person类 4.编写顺序表(类) 5.编写测试程序(m ...

  4. 【数据结构】单链表的实现

    文章目录 1. 链表 1.1 链表的概念及结构 1.2 链表的分类 1.3 链表的实现 1. 4 结尾 1. 链表 之前我们实现了顺序表,接下来来学习链表,并且理解顺序表和链表的区别 1.1 链表的概 ...

  5. 数据结构:单链表——带头结点与不带头结点步骤详解

    单链表:带头结点与不带头结点详解 在本人的另一篇文章中,通过java实现了带头结点和不带头结点的单链表,有兴趣的小伙伴可以去看下数据结构(一):链表(Linked List) 这两天回顾下链表的知识, ...

  6. 【C数据结构】单链表的实现以及链表和顺序表的优缺点

    文章目录 一.链表和顺序表的相辅相成 二.认识链表的最简单结构(单链表) 1.单链表的结构: 2.单链表的简单操作实现: (1).提前准备(头文件和测试源文件) (2).单链表的头插.尾插与创建一个新 ...

  7. 大家一起学数据结构之单链表

    最近工作上得一些感触,要想不当码农学好数据结构是必须滴. 好了,话不多说,下面开始第一个内容 单链表 一.先来介绍下单链表得结构吧 大概就这样了,别嫌丑. 单链表有带头结点得和不带头结点得,其中每个节 ...

  8. python数据结构之单链表

    今天终于把大学都没想明白的链表数据结构整明白了,也算小小的收获,挺好玩的.文后附链表操作示意图. 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. ...

  9. 数据结构之单链表 python实现

    链表是线性表的链式存取的数据结构,是一种链式存取的数据结构,是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点 ...

最新文章

  1. 戈峻:英特尔推动嵌入式教育 意在双赢
  2. php源代码保护——PHP加密方案分析解密还原
  3. [云炬小程序实战笔记] 第3章 云炬博客小程序全局配置
  4. PDF阅读器Foxit Reader 2.2简体中文版
  5. 实现机器学习的循序渐进指南X——KMeans
  6. Android学习之Activity生命周期
  7. 通信原理matlab仿真教程 赵鸿图,通信原理MATLAB仿真教程中国通信学会普通高等教育“十二五”规划教材立项项目课件作者赵鸿图茅艳第8章节.ppt...
  8. 数学建模——层次分析法模型
  9. 【sketchup 2021】草图大师的场景优化工具3【新建材质、材质编辑面板的详细说明】【重要】
  10. python输入整数反转输出_Python反转输出正整数
  11. python将文字转换成图片_使用Python脚本将文字转换为图片的实例分享
  12. 想做赴日软件工程师,为公为私
  13. 数据库管理员、系统分析员、数据库设计人员,应用程序员的职责是什么?
  14. 漫谈程序员系列:薪资,你是我不能言说的伤
  15. VMD常用命令(转载)
  16. 二维空间最近点对问题 python
  17. 万物云开启路演:拟募资8亿美元 淡马锡与高瓴是基石投资者
  18. QC新旧七图汇总连载13——过程决策方法图(PDPC)
  19. 为什么你的微信群设置不了管理员?
  20. java登录注册抽奖完整代码_Java抽奖系统(附完整代码)

热门文章

  1. 题目1105:字符串的反码
  2. ASP.NET程序中常用的三十三种代码 〔转〕
  3. 《LeetCode力扣练习》第11题 C语言版 (做出来就行,别问我效率。。。。)
  4. php redis 接口,PHP 开发 APP 接口 --Redis篇(示例代码)
  5. 计算机仿真和vr的区别,AR对比VR有何不同?你能分清楚他们的区别么
  6. 反arp攻击软件_网络安全工程师教Kali Linux:ARP欺骗概述
  7. hive导数据到mysql 自增主键出错_老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”...
  8. java获取id值_从另一页获取ID值[重复]
  9. sylog mysql_syslog-ng+loganalyzer搭建日志集中监控平台
  10. Win10:你需要来自XXX的权限才能对此文件夹进行更改