设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。

在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。

  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。

  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。

  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。

  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

  • printList():遍历链表

  • isEmpty():判断链表是否为空

示例:

MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2);   //链表变为1-> 2-> 3
linkedList.get(1);            //返回2
linkedList.deleteAtIndex(1);  //现在链表是1-> 3
linkedList.get(1);            //返回3
public class MyLinkedList {private int size = 0;//链表长度class Node{private int val;private Node next;public Node(){val = 0;next = null;}public Node (int val){this.val = val;next = null;}}private Node head = null;public MyLinkedList() {//初始化链表什么结点都没有}public int get(int index) {if (index<0 || index >= size) return -1;int j = 0;Node p  =head;while(p!=null){if (j==index){return p.val;}j++;p = p.next;}return -1;}public void addAtHead(int val) {//链表什么结点都没的情况if (head==null){head = new Node(val);}else{Node s = new Node(val);s.next = head;head = s;}size++;}public void addAtTail(int val) {Node s = new Node(val);int j = 0;Node p = head;while(p!=null){if (j==size-1){p.next = s;break;}j++;p = p.next;}//链表什么结点都没的情况if (p==null){head = new Node(val);}size++;}public boolean isEmpty(){if (size==0) return true;return false;}public void printList(){Node p = head;while(p!=null){System.out.print(p.val+" ");p = p.next;}}/*addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。*/public void addAtIndex(int index, int val) {if (index==size){addAtTail(val);//addAtTail()里面已经size++,所以外面不用size++}else if (index > size) return ;else if (index <= 0)//记得加等于号,不要写成(index < 0){addAtHead(val);//addAtHead()里面已经size++,所以外面不用size++}else{int j = 0;Node p = head;while(j < index-1){j++;p = p.next;}Node s = new Node(val);s.next = p.next;p.next = s;size++;}}public void deleteAtIndex(int index) {if (index < 0 || index >= size ) return;Node p = head;int j = 0;while(j < index-1){j++;p = p.next;}//如果删除的是第一个结点if (index==0){if (head.next!=null){//链表有两个以上的结点,所以删除第一个结点时,//可以让第一个结点的值等于下一个结点,然后就是很简单的转换成删除第二个结点了,//将特殊情况变普通head.val = head.next.val;head.next = head.next.next;}else{//链表就只有一个结点head=null;}}else{p.next = p.next.next;}size--;}
}/*** Your MyLinkedList object will be instantiated and called as such:* MyLinkedList obj = new MyLinkedList();* int param_1 = obj.get(index);* obj.addAtHead(val);* obj.addAtTail(val);* obj.addAtIndex(index,val);* obj.deleteAtIndex(index);*/

Java设计链表(不带头结点的单链表)相关推荐

  1. 单链表-在带头结点的单链表L中删除一个最小值结点(四指针)

    单链表的存储结构: typedef struct LinkList{int data;LinkList * next;} 分析: 要删除一个链表的最小值节点,首先想到的是肯定是要定义两个指针,但是 , ...

  2. java带头结点的单链表_自己实现集合框架 (五): 带头结点单链表的实现

    这是系列文章,每篇文章末尾均附有源代码地址.目的是通过模拟集合框架的简单实现,从而对常用的数据结构和java集合有个大概的了解.当然实现没有java集合的实现那么复杂,功能也没有那么强大,但是可以通过 ...

  3. java不带头结点单链表,java带头结点的单链表

    JAVA 循环双链表的建立 import java.util.Scanner; //循环双向链表的结点类 class DuLNode { private Object data;// 存放结点值 前驱 ...

  4. 数据结构:假设有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母

    假设有一个带头结点的单链表L,每个结点值由单个数字.小写字母和大写字母构成.设计一个算法将其拆分成3个带头结点的单链表L1.L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3 ...

  5. 【一元多项式算法】设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接。设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中。

    [一元多项式算法]设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接.设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中. #include<s ...

  6. 【C语言】数据结构C语言版 实验3 带头结点的单链表

    slnklist.h #include <stdio.h> #include <stdlib.h> /************************************* ...

  7. 【C语言】数据结构C语言版 实验2 不带头结点的单链表

    运行环境:Dev-C++ vs2013可能不能运行 首先新建一个头文件slnklist.h #include <stdio.h> #include <stdlib.h> /** ...

  8. 数据结构--带头结点的单链表

    单链表分为:带头结点和不带头结点,不带头结点的单链表需要用到二级指针,容易出错. 1.结构体设计 typedef int ELEM_TYPE; //有效数据节点结构体设计(头结点借用) typedef ...

  9. 【带头结点的单链表】

    带头结点的单链表 前言 一.带头结点的单链表结构体设计 1. 带头结点的单链表 2. 结构体声明 二.函数实现 1. 初始化 2. 申请新节点 3. 头插 4. 尾插 5. 按位置插入 6. 头删 7 ...

最新文章

  1. 基于pxe+dhcp+ks实现自动安装系统
  2. 电脑编程python老是出现错误_python常见的编程错误
  3. 简述回源原理和CDN常见多级缓存
  4. typescript获取数据库数据_肿瘤药敏多组学数据库(GDSC)的数据介绍和获取
  5. django 中间件的使用
  6. 摆脱困境:将运行时配置作为JSON返回
  7. 公司间交易学习笔记---概述
  8. 求一元二次方程(信息学奥赛一本通-T1058)
  9. A child container failed during start 解决方案
  10. [转]Why Not Paxos
  11. keras h5和hdf5的区别
  12. batchplot插件用法_Batchplot设置使用指南,实现批量打印CAD图纸
  13. Python:利用Entrez库筛选下载PubMed文献摘要
  14. 《不只是美:信息图表设计原理与经典案例》—— 2.7 更加灵活
  15. 代码设置margintop_js获取css属性,更改margin-top属性,给每个a标签的margin-top属性在原基础上 +5px...
  16. 华为交换机vlan配置举例_一步步详解华为交换机配置实例,一看就会
  17. Hibernate ORM - 一对多双向关联关系(我是韦小宝)
  18. 初识MQ和RabbitMQ
  19. 100-days: thirty-two
  20. 基于Conv3D实现三维立体MNIST数据集分类

热门文章

  1. Android之实现夸克浏览器书签和历史页面滑动时候右上角图标切换效果
  2. Android之国际化部分文字生效而部分文字没有生效的坑
  3. Android之部分手机(oppo r9s)安装app出现崩溃问题解决办法
  4. linux c之main(int argc, char *argv[], char *envp[])参数意义
  5. Web程序员的Mysql进阶序三之sql多表数据删除、子查询、联合查询
  6. python顺序结构实验设计_Python程序设计实验报告二:顺序结构程序设计
  7. 这6个地方不去简直太可惜!
  8. 超炫酷的枪械3D动图,喜欢的不得了!
  9. 除了 Python ,这些语言写的机器学习项目也很牛
  10. 从基础概念到数学公式,这是一份520页的机器学习笔记(图文并茂)