2019独角兽企业重金招聘Python工程师标准>>>

public class LinkList<T> {// 定义一个内部类Node,Node实例代表链表的节点private class Node {// 保存节点的数据private T data;// 指向下个节点的引用private Node next;// 无参数的构造器public Node() {}// 初始化全部属性的构造器public Node(T data, Node next) {this.data = data;this.next = next;}}// 保存该链表的头节点private Node header;// 保存该链表的尾节点private Node tail;// 保存该链表中已包含的节点数private int size;// 创建空链表public LinkList() {// 空链表,header和tail都是nullheader = null;tail = null;}// 以指定数据元素来创建链表,该链表只有一个元素public LinkList(T element) {header = new Node(element, null);// 只有一个节点,header、tail都指向该节点tail = header;size++;}// 返回链表的长度public int length() {return size;}// 获取链式线性表中索引为index处的元素public T get(int index) {return getNodeByIndex(index).data;}// 根据索引index索引获取指定位置的节点private Node getNodeByIndex(int index) {if (index < 0 || index > size - 1) {throw new IndexOutOfBoundsException("线性表索引越界");}// 从header节点开始Node current = header;for (int i = 0; i < size && current != null; i++, current = current.next) {if (i == index) {return current;}}return null;}//查找链式线性表中指定元素的索引public int locate(T element) {// 从头节点开始搜索Node current = header;for (int i = 0; i < size && current != null; i++, current = current.next) {if (current.data.equals(element)) {return i;}}return -1;}// 向线性链式表的指定位置插入一个元素public void insert(T element, int index) {if (index < 0 || index > size) {throw new IndexOutOfBoundsException("线性表索引越界");}// 如果是空链表if (header == null) {add(element);} else {// 当index为0时,链表头处插入if (index == 0) {addAtHeader(element);} else {// 获取插入点的前一个节点Node prev = getNodeByIndex(index - 1);// 让prev的next指向新节点,让新节点的next引用指向原来prev的下一个节点prev.next = new Node(element, prev.next);size++;}}}// 采用尾插法为链表添加新节点public void add(T element) {// 如果该链表还是空链表if (header == null) {header = new Node(element, null);tail = header;} else {// 创建新节点Node newNode = new Node(element, null);// 让尾节点的next指向新增的节点tail.next = newNode;//以新节点作为新的尾节点tail = newNode;}size++;}// 采用头插法为链表添加新节点public void addAtHeader(T element) {// 创建新节点,让新节点的next指向原来的header,并以新节点作为新的headerheader = new Node(element, header);// 如果插入之前是空链表if (tail == null) {tail = header;}size++;}// 删除链式线性表中指定索引处的元素public T delete(int index) {if (index < 0 || index > size - 1) {throw new IndexOutOfBoundsException("线性表索引越界");}Node del = null;// 如果被删除的是header节点if (index == 0) {del = header;header = header.next;} else {// 获取删除点的前一个节点Node prev = getNodeByIndex(index - 1);// 获取将要被删除的节点del = prev.next;// 让被删除节点的next指向被删除节点的下一个节点prev.next = del.next;// 将被删除节点的的next引用del.next = null;}size--;return del.data;}// 删除链式线性表中最后一个元素public T remove() {return delete(size - 1);}// 判断链式线性表是否为空表public boolean empty() {return size == 0;}// 清空线性表public void clear() {header = null;tail = null;size = 0;}public String toString() {if (empty()) {return "[]";} else {StringBuilder sb = new StringBuilder("[");for (Node current = header; current != null; current = current.next) {sb.append(current.data.toString() + ", ");}int len = sb.length();return sb.delete(len - 2, len).append("]").toString();}}
}
public class LinkListTest {public static void main(String[] args) {LinkList<String> list = new LinkList<String>();list.insert("aaaa", 0);list.add("bbbb");list.add("cccc");list.insert("dddd", 1);System.out.println("链式线性表中插入元素后列表:" + list.toString());list.delete(2);System.out.println("链式线性表中删除元素后列表:" + list.toString());System.out.println("cccc在链表中的位置:" + list.locate("cccc"));System.out.println("链式线性表中索引2处的元素:" + list.get(2));}
}

转载于:https://my.oschina.net/u/3545495/blog/1627690

【数据结构】线性表之链式线性表相关推荐

  1. js正則表達式--验证表单

    检測手机号码:/0? (13|14|15|18)[0-9]{9}/ 检測username:(数字,英文,汉字.下划线.中横线):/^[A-Za-z0-9_\-\u4e00-\u9fa5]+$/ pas ...

  2. 数据结构——线性表之链式存储结构

    单链表: 概念: 1.由于线性表的顺序存储在插入与删除时需要移动大量元素,适用于不经常改变元素的情况,那么当我们需要经常操作元素时该怎么办,这就有了接下来的线性表的链式存储结构 2.单链表在内存的存储 ...

  3. 数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)

    目录 一.单链表 1.存储方式 2.插入 3.删除 总代码: 二.静态链表 1.存储方式 2.插入 3.删除 4.遍历 总代码: 三.循环链表 总代码: 四.双向循环链表 1.存储方式: 2.插入和删 ...

  4. 数据结构-- 线性表之链式存储

    https://www.cnblogs.com/ZWOLF/p/10604252.html

  5. 线性表之链式存储结构

    线性表的顺序存储结构,插入和删除时需要移动大量元素,耗费时间,可解决这些问题. 转载于:https://www.cnblogs.com/cailingsunny/p/4562287.html

  6. 头歌实践教学平台数据结构与算法链式线性表——课上练

    针对数据结构链式表在头歌平台练习过程中的完成代码,仅仅为作者一次通过(可能并未按照题目要求时间复杂度或空间复杂度),仍有较大优化空间,如有其他需求可留言. #include <stdio.h&g ...

  7. 线性表之链式存储结构_单链表相关算法

    在存储结构上,不需要连续的存储空间,需要上一个结点的指针域 指向下一个结点即可,找到一个结点就可以找到下一个结点. 学习教材是大话数据结构,加上自己的一些个人理解.这个算法 有点绕,需要对指针 相关内 ...

  8. C++数据结构03--静态链式线性表的实现

    头文件: //静态链表头文件 #include "stdafx.h"using namespace std;#define MAXSIZE 250typedef int ElemT ...

  9. 【数据结构与算法】之线性表的应用和操作

    数据结构概念 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合. 数据结构的逻辑结构:数据对象中数据元素之间的相互关系,分为线性结构.树形结构.图形结构以及集合结构. 数据结构的物理结构:数 ...

  10. 链式线性表和顺序线性表

    顺序线性表 顺序表的存储结构通常用一维数组来描述,数组的下标与元素在线性表中的序号相对应. 在这里插入代码片 线性表的存储结构: typedef struct {int elem[MAX_SIZE]; ...

最新文章

  1. 无人车巨头每天都在做相同的事情:不惜血本做高精地图是为何?
  2. 德国图宾根大学发布可扩展「对抗黑盒攻击」,仅通过观察决策即可愚弄深度神经网络
  3. 计算机音乐刚好遇见你乐谱,《刚好遇见你》曲谱_刚好遇见你乐谱
  4. Linux怎么对当前目录提权,linux提权方法(不断总结更新)
  5. CL_CRM_REPORT_QUESTION call CRM_REPORT_RF_CHECK_AUTHORITY
  6. print writer保留原有信息写文件_Python读写EXCEL文件常用方法大全 - pythonputao
  7. iOS NSTextAttachment - 图文混排
  8. 使用countDownLahct模拟多线程并发场景
  9. tp5 database.php,Tp5项目修改数据库
  10. FL studio 20简易入门教程 -- 第三篇 -- 菜单栏讲解(下)
  11. lpush rpush 区别_关于redis之lpush、rpush、lset、lrem
  12. Mandriva linux 资源列表
  13. 51单片机和315M无线发射模块编码与解码
  14. 干货|FOF资产配置方案全解析
  15. 写开源项目到底究竟有多赚钱?
  16. Linux NAPI机制分析
  17. 字母数字特殊字符部分unicode对照表
  18. 错误 C4996 ‘stricmp‘: The POSIX name for this item is deprecated. Instead,use the ISO C and C++解决方案
  19. 飞机大战游戏详解5.31
  20. 腾讯可视化, 低代码生成器,正式开源!

热门文章

  1. TCP/IP协议学习(四) 基于C# Socket的Web服务器---静态资源处理
  2. 在VB中使用Linq To SQLite注意事项
  3. Redmine(Ruby)配置经验
  4. stream、string、byte[] 互转
  5. 在.NET 对XML的一些基本操作
  6. 简单的实现了Dijkstra,
  7. 如何使用CleanMyMac清理Mac苹果电脑中DNS缓存?
  8. Mac上有什么实用的必备软件?
  9. [Swift][leetcode] 433. 最小基因变化
  10. python3 + flask + sqlalchemy +orm(3):多对多关系