什么是链表?

链表是一个线性结构,但是存储的数据可以是非线性的。链表由一个个子节点构成,每个节点有两个部分:数据域和指针域,数据域就是实际存储数据的,指针域可以有一个和两个,单链表就是单个指针域指向后一个节点,双链表就是节点有两个指针域,分别指向前一个和后一个节点。

链表的核心:

链表的核心就是指针域,通过对指针域的操作实现增加节点删除节点,所谓链表就是形象的表示出一环扣一环,这是链表的优点也是缺点,优点是:插入删除不需要移动所有节点,只需要将待插入的节点的指针域一个指向待插入位置的后一个节点,一个指向前一个节点;缺点就是搜索的时候必须遍历节点。

Java实现链表基本操作

//一个节点

class Node {

public Node next;

public Node prev;

public E item;

public Node(E data) {

this.item = data;

next = null;

prev = null;

}

}

public class MyLinkedList {

private Node head; //表头

private Node tail; //表尾

private int size; //表长

public MyLinkedList() {

size = 0;

head = null;

tail = null;

}

public int size() {

return this.size;

}

public void add(E o) { //将o增加到链表尾部

Node tempNode = new Node(o);

if(size == 0){ //节点为空节点的时候

head = tempNode;

tail =tempNode;

}else {

tail.next = tempNode;

tempNode.prev = tail;

tail = tempNode;

}

size++;

}

public E remove() { //从头移除元素

return removeFirst();

}

public void showList(){

Node tempNode = head;

while(tempNode != null){

System.out.println(tempNode.item + " ");

tempNode = tempNode.next;

}

}

public void showListRevise(){

Node tempNode = tail;

while(tempNode != null){

System.out.println(tempNode.item + " ");

tempNode = tempNode.prev;

}

}

public E remove(int index) { //删除指定位置的元素

Node tempNode;

Node resultNode;

if(index<0 || index>size){

return null;

}else {

if (index < (size >> 1)) {

tempNode = head;

for(int i=0;i

tempNode = tempNode.next;

Node par = tempNode.prev;

Node ch = tempNode.next;

tempNode.prev.next = tempNode.next;

tempNode.next.prev = tempNode.prev;

resultNode = tempNode;

} else {

tempNode = tail;

for(int i=size-1;index

tempNode = tempNode.prev;

resultNode = tempNode;

tempNode = tempNode.prev;

}

size--;

return resultNode.item;

}

}

public boolean remove(Object o) {

return removeFirstOccurrence(0);

}

public E removeFirst() {

Node tempNode;

if(size>0){

tempNode = head;

head = head.next;

head.prev = null;

size--;

return tempNode.item;

}else

return null;

}

public E removeLast() {

E temp = tail.item;

tail = tail.prev;

tail.next = null;

size--;

return temp;

}

public boolean removeFirstOccurrence(Object o){ //删除此列表中指定元素的第一个出现(从头到尾遍历列表时)。

int tempSize = size;

Node tempNode = head;

for(int i=0;i

if(tempNode.item.equals(o)){

tempNode.prev = tempNode.next;

tempNode.next = tempNode.prev;

size--;

return true;

}

}

return false;

}

public void addFirst(E o) { //将o插入链表开头

Node tempNode = new Node(o);

if(size==0){

head = tempNode;

tail = tempNode;

}else {

tempNode.next = head;

tempNode.prev = null; //前一个节点是空

head = tempNode;

}

size++;

}

public void addLast(E o) { //将o增加到链表尾部

Node tempNode = new Node(o);

if(size==0){

head = tempNode;

tail = tempNode;

}else {

tail.next = tempNode;

tempNode.prev = tail;

tail = tempNode;

}

size++;

}

public void clear() { //清空链表

head = null;

tail = null;

size = 0;

}

public boolean contains(E o) { //判断元素o是否包含于链表

int tempSize = size;

Node tempNode = head;

Boolean result = false;

while (tempSize != 0) {

Object o1 = tempNode.item;

if(o.equals(o1)){

result = true;

}

tempNode = tempNode.next;

tempSize--;

}

return result;

}

public E get(int index) { //获取指定节点

Node tempNode;

if(index < 0 || index >= size) {

return null;

}else {

if(index < (size >> 1)) { //右移

tempNode = head;

for(int i=0;i

tempNode = tempNode.next;

return tempNode.item;

}else {

tempNode = tail;

for (int i = size-1; index < i; i--) {

System.out.println(index+ " " + i);

tempNode = tempNode.prev;

}

return tempNode.item;

}

}

}

}

链表 java详解_链表详解——Java版相关推荐

  1. java 委托机制_通过反射实现Java下的委托机制代码详解

    简述 一直对Java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块API public Class Delegater()//空参构造,该类管理委托实例并 ...

  2. java 7 反射_【7】java 反射详解

    [7]java 反射详解 获取Class对象的方式: 1. Class.forName("全类名"); 将字节码加载进内存,返回Class对象,多用于配置文件,将类名定义在配置文件 ...

  3. java架构师_成为一名Java高级架构师究竟要学哪些东西??

    Java架构师,应该算是一些Java程序员们的一个职业目标了吧.很多码农码了五六年的代码也没能成为架构师.那成为Java架构师要掌握哪些技术呢,总体来说呢,有两方面,一个是基础技术,另一个就是组织能力 ...

  4. 做Java头发少_这35个Java代码优化细节,你用了吗

    链接:https://www.jianshu.com/p/6e472304b5ac 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有 ...

  5. java应用开发_开发简单的Java应用

    第一章 开发简单的Java应用 1.Java语言的技术分类 (1)JavaSE:标准版,开发桌面应用 (2)JavaEE:企业版,Web应用 (3)JavaME:小型版,嵌入式 2.如何开发和运行Ja ...

  6. java 双向链表循环_双向循环链表的Java版本实现

    1.单项循环列表 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环.和单链表相比,循环单链表的长处是从链尾到链 ...

  7. 孙鑫java基础视频教程_孙鑫老师JAVA无难事视频教程 最适合java入门学习打基础的课程 附源码讲义 12课...

    课程介绍 由孙鑫老师亲自授课录制.内容涵盖面广,从入门到精通,授课通俗易懂,分析问题独到精辟,学员通过本套光盘的学习,能够快速掌握Java编程语言,成为Java高手. 由孙鑫老师亲自授课录制.内容涵盖 ...

  8. 我的世界中国版java模组_我的世界中国版下载,我的世界中国版下载不了mod

    我的世界中国版下载,我的世界中国版下载不了mod 来源:互联网/编辑:佚名/时间:2020-10-10 在手机上看 扫一扫进入手机端 我的世界电脑版怎么下载地? 有一个我的世界的软件叫麦块,这个软件里 ...

  9. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  10. java 判断类型_如何快速入门Java编程学习(干货)

    一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...

最新文章

  1. 混合密度网络(MDN)进行多元回归详解和代码示例
  2. Final Cut Pro快捷键
  3. 以太网和路由设置,内网和外网同时上
  4. 高擎信息安全大旗,打造“互联网+”新服务模式
  5. mac下hive-2.2.0-src版本的编译
  6. python3处理大文件
  7. How to Run Mac OS X in VirtualBox on Windows
  8. java实现5 4 3 2 1递归_递归及递归的使用
  9. 1024程序员节 | 近300本python电子书推荐
  10. 在Windows下配置svn服务端钩子程序
  11. html中含有value属性的标签及Value的作用
  12. dry的原理_【面板制程刻蚀篇】史上最全Dry Etch 分类、工艺基本原理及良率剖析...
  13. linux下gbd调试基础
  14. Scrach基本概念与操作
  15. java中static什么意思_Java中static的含义和用法
  16. 巧用“谷歌学术”,轻松完成参考文献
  17. 中国象棋对弈系统java的程序包谁有?
  18. SpringCloud和SpringCloudAlibaba的区别
  19. win2K3安装sql2000提示“安装程序配置服务器失败”的常见解决办法
  20. 搞笑不需要理由,搞笑就是理由!

热门文章

  1. 【精彩回顾】软件DevOps云化发展的趋势
  2. leetcode71 (2022.1.6)
  3. 红橙Darren视频笔记 UML图简介
  4. gprMax 3.1.5 安装以及在pycharm或VScode中运行的方法
  5. 高等组合学笔记(十四):Lagrange反演公式
  6. Josephus问题的Java解决方法
  7. 【docker】win10子系统ubuntu安装docker
  8. 如何判断链表有环并计算环的长度
  9. Vue动态类名的实现
  10. CSS练习_无限滚动