本文描述了基于线性表的简单算法及其代码【Java实现】

1-1 删除单链表中所有重复元素

	// Example 1-1 删除单链表中所有重复元素
private static void removeRepeat(LinkList L)
{
Node node = L.head.next; // 首结点
while (node != null) // 一重循环,遍历L中的每一个元素
{
// Object data=p.data;
Node p = node; // q结点的前驱
Node q = p.next; // 与node数据相同的结点
while (q != null) // 二重循环,寻找相同结点
{
if (node.data.equals(q.data))
{
p.next = q.next; // 删除q结点
} else
{
p = p.next; // 不相同时p结点后移,相同时p待在原位等待下一次比较
}
q = q.next; // 无论相不相同q结点都要后移
}
node = node.next;
}
}

第二种方法:

	// Example 1-1 书本代码
private static void removeRepeatElem(LinkList L) throws Exception
{
Node p = L.head.next, q; // p为首结点
while (p != null)
{
int order = L.indexOf(p.data); // 记录下p的位置
q = p.next;
while (q != null)
{
if (p.data.equals(q.data))
{
L.remove(order + 1); // order+1即为q结点的位置
} else
{
++order; // 使得每次order都是q结点的前驱
}
q = q.next;
}
p = p.next;
}
}

1-2 删除所有数据为x的结点,并返回数量,算法思想与1-1差不多

	// Example 1-2 删除所有数据为x的结点,并返回数量,算法思想与1-1差不多
private static int removeAll(LinkList L, Object x)
{
Node p = L.head;
Node q = p.next;
int count = 0;
while (q != null)
{
if (q.data.equals(x))
{
p.next = q.next;
count++;
} else
{
p = p.next;
}
q = q.next;
}
return count;
}

测试我们的两种算法的结果:

算法1-1:

算法1-2:

2-1 试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1,a2…,an)逆置为(an,an-1…,a1)

	// Example 2-1 实现对顺序表的就地逆置
// 逆置:把(a1,a2,......,an)变成(an,an-1,...,a1)
// 就地:逆置后的数据元素仍存储在原来的存储空间中
private static void reverseSqList(SqList L)
{
for (int i = 0; i < (int) (L.curLen / 2); i++) // 确定循环次数,偶数为长度的一半,奇数为长度减一的一半,因此取curLen/2的整数
{
//下面三个语句实现就地逆置
Object temp = L.listItem[i];
L.listItem[i] = L.listItem[L.curLen - 1 - i];
L.listItem[L.curLen - 1 - i] = temp;
}
}

2-2 实现对带头结点的单链表的就地逆置

	// Example 2-2 实现对带头结点单链表的就地逆置
private static void reverseLinkList(LinkList L) throws Exception
{
Node p = L.head.next;
L.head.next = null;
while (p != null)
{
Node q=p.next; // q指向p的后继,保留住后续结点
// 下面两个语句实现头插法,将p插入在位置为0的地方
p.next=L.head.next; // p的后继指向首结点
L.head.next=p; // 首结点指向p
p = q; // p重新指向后续结点
}
}

测试结果:

算法2-1:

算法2-2:

3-1 实现在非递减的有序整型单链表中插入一个值为x的数据元素,并使单链表仍保持有序

	// Example 3-1 实现在非递减的有序整型单链表中插入一个值为x的数据元素,并使单链表仍保持有序
private static void insertOrder(LinkList L, int x)
{
Node p = L.head.next; // 首结点
Node q = L.head; // p的前驱
while (p != null && Integer.valueOf(p.data.toString()) < x) // 当结点p的值大于等于x时跳出while
{
q = q.next;
p = p.next;
}
Node s = new Node(x);
s.next = p;
q.next = s;
}

3-2 实现将两个非递减链表LA和LB合并排列成一个新的非递减链表LA

	// Example 3-2 实现将两个非递减链表LA和LB合并排列成一个新的非递减链表LA
private static LinkList mergeList(LinkList LA, LinkList LB) throws Exception
{
Node pa = LA.head.next; // LA首结点
Node pb = LB.head.next; // LB首结点
// LA.head.next = null; // 置空LA链表,这话写与不写都不影响插入
Node tail = LA.head; // 指向新链表LA的最后一个结点
while (pa != null && pb != null)
{
// 使用尾插法,按照非递减顺序插入,并且不需要插入时不需要将pa或pb指向null,因为最后插入的结点一定是null
if (Integer.valueOf(pa.data.toString()) < Integer.valueOf(pb.data.toString()))
{
// 若pa.data小于pb.data则将pa插在尾结点后,并且继续比较pa后续结点,直到出现大于等于pb的结点为止
tail.next = pa;
tail = pa; // tail后移
pa = pa.next; // 使得pa重新指向后续结点
} else
{
// 若pa.data大于等于pb.data则将pb插在pa的前面,并且继续比较pb后续结点,直到出现大于pa的结点为止
tail.next = pb;
tail = pb; // tail后移
pb = pb.next; // 使得pb重新指向后续结点
}
}
tail.next = (pa != null ? pa : pb);
return LA;
}

测试结果:

算法3-1:

算法3-2:

以上便是基于线性表的简单算法,此系列后面会陆续介绍更多有关数据结构的内容,也会更新一些关于数据结构的算法题目例子,谢谢大家支持!

【线性表基础】基于线性表的简单算法【Java版】的更多相关文章

  1. 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】

    本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...

  2. MySQL--单表查询、多表查询简单概述

    表的前期准备: create table emp( id int not null unique auto_increment, name ) not null, sex enum('male','f ...

  3. "《算法导论》之‘线性表’":基于静态分配的数组的顺序表

    首先,我们来搞明白几个概念吧(参考自网站数据结构及百度百科). 线性表 线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外, ...

  4. 数据结构(java版)学习笔记(一)——线性表

    一.线性表的定义 线性表是n(n>=0)个具有相同特性的数据元素的有限序列. 线性表是最简单.最常用的一种数据结构 线性表属于线性结构的一种 如果一个数据元素序列满足: (1)除第一个和最后一个 ...

  5. 数据结构(java版)学习笔记(二)——线性表之顺序表

    顺序表的优点: 随机存取元素方便,根据定位公式容易确定表中每个元素的存储位置,所以要指定第i个结点很方便 简单,直观 顺序表的缺点: 插入和删除结点困难 扩展不灵活,难以确定分配的空间 容易造成浪费 ...

  6. PHP数据结构之二 线性表中的顺序表的PHP实现

    线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...

  7. YTU 2989: 顺序表基本运算(线性表)

    2989: 顺序表基本运算(线性表) 时间限制: 1 Sec  内存限制: 128 MB 提交: 1  解决: 1 题目描述 编写一个程序,实现顺序表的各种基本运算(假设顺序表的元素类型为char), ...

  8. C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

    前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...

  9. 已知长度为n的线性表采用顺序结构,写一算法删除该线性表中所有值为item的元素

    /** * @author:(LiberHome) * @date:Created in 2019/2/27 23:34 * @description: * @version:$ */ /*已知长度为 ...

随机推荐

  1. Jmeter系列(30)- 详解 JDBC Request

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 JDBC Request 主要是 ...

  2. VulnHub PowerGrid 1.0.1靶机渗透

    ​本文首发于微信公众号:VulnHub PowerGrid 1.0.1靶机渗透,未经授权,禁止转载. 难度评级:☆☆☆☆☆官网地址:https://download.vulnhub.com/power ...

  3. keras 从txt加载预测数据

    ImageDataGenerator.flow_from_directory()的用法已经非常多了,优点是简单方便,但数据量很大时,需要组织目录结构和copy数据,很浪费资源和时间 1. 训练时从tx ...

  4. .net core 使用 swagger 生成接口文档

    微软参考文档:https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-help-pages-using-swagger?tabs= ...

  5. SpringBoot中Service实现类添加@Service却任然无法注入的问题

    最近一直在研究Spring Boot.从GitHub上下载了一个my-Blog源码,一边看,一边自己尝试去实现,结果掉在坑了,研究了近一周才爬出来,特地来这博客园记录下来,一是避免自己在放这样的错误, ...

  6. CenterOS的安装配置(配图解)

    CenterOS的安装配置 一.    配置虚拟机 打开Virtual Machine(虚拟机),点击create new virtual machine 进入新建虚拟机向导页面,选择[Custom( ...

  7. web网页多语言的实现方案_前端实现多语言切换

    实现的效果 需要在web中实现多语言的切换,当用户语言切换完成后下次重新打开网页,也是上次设置的语言进行显示. 资源网站搜索大全https://55wd.com 实现步骤 1.在用户点击切换语言后,把 ...

  8. 由VIP漂移引发的算法异常问题调查和解决

    最近工作中的一个问题,耗时一个月之久终于调查完毕且顺利解决,顿时感慨万千.耗时之久和预期解决时间和环境搭建以及日志不合理等等有关,当然这个并非此文的重点.之所以在很久以后的今天又开始写文,主要是这个问 ...

  9. drf权限,频率,过滤,排序,异常处理

    目录 一.权限 1 权限源码分析 2 自定义权限类 3 内置权限类 二.频率 1 内置频率设置 三.过滤 四.排序 五.异常处理 一.权限 1 权限源码分析 # APIView---->disp ...

  10. scala 数据结构(七 ):集 Set

    集是不重复元素的结合.集不保留顺序,默认是以哈希集实现 默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包 1 集 ...