Java单链表
一、概述

二、主方法
//创建头结点
private HeroNode head = new HeroNode(-1,null,null);
//计数器,用于id的自增
private static int count=0;
@Test
public void test(){
//1.0插入节点
insertNode(new HeroNode(++count,"亚瑟","坦克"));
insertNode(new HeroNode(++count,"甄姬","法师"));
insertNode(new HeroNode(++count,"后裔","射手"));
insertNode(new HeroNode(++count,"赵云","刺客"));
//2.0打印链表
printLinked(); //3.0根据id删除节点
//deleteNode(2); //4.0更新数据,根据id
//updateData(new HeroNode(2,"诸葛亮","法师")); //5.0根据id查找英雄
//findData(2); //6.0查找链表的节点个数(有效的)
//System.out.println(getLength()); //7.0利用栈stack()反转链表
//reverseLinkedStack(); //8.0反转链表
//reverseLinked(); //9.0找倒数第k个节点
System.out.println(show( findLastIndexNode(2)));
//printLinked();
}
二、节点类
class HeroNode{
//值域
private int id;
private String name;
private String nickName;
//指针域
private HeroNode next;
HeroNode(int id, String name, String nickName) {
this.id = id;
this.name = name;
this.nickName = nickName;
}
/* @Override
public String toString() {
return "HeroNode{" +
"id=" + id +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
", next=" + next +
'}'+"\n";
}*/
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public HeroNode getNext() {
return next;
}
public void setNext(HeroNode next) {
this.next = next;
}
}
三、基本功能实现
1、打印单个节点
public String show(HeroNode h){
return "{" +
"本节点id="+ h.toString().substring(h.toString().lastIndexOf('.')+1)+ '\'' +
"id=" + h.getId() +
", name='" + h.getName() + '\'' +
", nickName='" + h.getNickName() + '\'' +
", next=" + h.getNext() + '\'' +
'}'+"\n";
}
2、插入新节点
//插入新节点
public void insertNode(HeroNode newNode){
if(head==null) {
System.out.println("头结点不能为空");
return;
}
if(newNode.getId()<1){
System.out.println("请输入正确的编号");
return;
}
HeroNode tmp = head;
while (tmp.getNext()!=null){
tmp=tmp.getNext();
}
tmp.setNext(newNode);
}
3、打印链表
public void printLinked(){
if(head==null) {
System.out.println("头结点不能为空");
return;
}
if(head.getNext()==null){
System.out.println("只有头结点,链表无数据");
return;
}
HeroNode tmp = head;
System.out.println(head);
while (tmp.getNext()!=null){
System.out.println(show(tmp.getNext()));
tmp=tmp.getNext();
}
}
4、删除指定id节点
//删除指定id节点
public void deleteNode(int id){
if(head==null) {
System.out.println("头结点不能为空");
return;
}
if(head.getNext()==null){
System.out.println("只有头结点,链表无数据");
return;
}
HeroNode tmp = head;
while (tmp.getNext()!=null){
if(tmp.getNext().getId()==id){
tmp.setNext(tmp.getNext().getNext());
return; }
tmp=tmp.getNext();
}
System.out.println("未找该英雄,请选择正确的编号id");
}
5、修改
//修改指定id节点的内容
public void updateData(HeroNode node){
if(head==null) {
System.out.println("头结点不能为空");
return;
}
if(head.getNext()==null){
System.out.println("只有头结点,链表无数据");
return;
}
HeroNode tmp = head;
while (tmp.getNext()!=null){
if(tmp.getNext().getId()==node.getId()){
//根据id更新节点内容,只需更新名字,id和next均不需更新
tmp.getNext().setName(node.getName());
tmp.getNext().setNickName(node.getNickName());
return;
}
tmp=tmp.getNext();
}
System.out.println("未找该英雄,请选择正确的编号id");
}
6、查找节点
//查找节点数据
public HeroNode findData(int id){
if(head==null) {
System.out.println("头结点不能为空");
return null;
}
if(head.getNext()==null){
System.out.println("只有头结点,链表无数据");
return null;
}
HeroNode tmp = head;
while (tmp.getNext()!=null){
if(tmp.getNext().getId()==id){
return tmp.getNext();
}
tmp=tmp.getNext();
}
System.out.println("未找该英雄,请选择正确的编号id");
return null;
}
四、较难功能
1、单链表反转:方法1(不能只交换数据,节点随数据一起交换)
//将单链表反转1
public void reverseLinked(){
if(head==null) {
System.out.println("头结点不能为空");
return ;
}
if(head.getNext()==null){
System.out.println("只有头结点,链表无数据");
return ;
}if(head.getNext().getNext()==null){
System.out.println("就一个节点,无法反转");
return ;
}
////定义一个辅助的指针(变量),帮助我们遍历原来的链表
HeroNode cur = head.getNext();
HeroNode next = null; //指向当前节点[cur]的下一个节点
HeroNode tmpHead = new HeroNode(-1,"","");
//遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead 的最前端
while (cur!=null){
//先暂时保存当前节点的下一个节点,因为后面需要使用
next = cur.getNext();
//将当前节点的next设置为,tmpHead的下一个节点 cur.setNext(tmpHead.getNext());
tmpHead.setNext(cur);
//节点后移
cur=next;
}
head.setNext(tmpHead.getNext());
printLinked();
}
2、单链表反转:方法2(不能只交换数据,节点随数据一起交换),利用stack()栈的先进后出(FIFO)特性
//将单链表反转2:stack()
public void reverseLinkedStack(){
Stack<HeroNode> stack = new Stack<>();
if(head==null) {
System.out.println("头结点不能为空");
return ;
}
if(head.getNext()==null){
System.out.println("只有头结点,链表无数据");
return ;
}
HeroNode tmp = head;
while (tmp.getNext()!=null){
stack.push(tmp.getNext());
tmp=tmp.getNext();
}
while(!stack.isEmpty()){
System.out.println(show(stack.pop()));
}
}
3、 查找单链表中的倒数第k个结点
//查找单链表中的倒数第k个结点
//1. 编写一个方法,接收head节点,同时接收一个index
//2. index 表示是倒数第index个节点
//3. 先把链表从头到尾遍历,得到链表的总的长度 getLength
//4. 得到size 后,我们从链表的第一个开始遍历 (size-index)个,就可以得到
//5. 如果找到了,则返回该节点,否则返回nulll
public HeroNode findLastIndexNode(int k){
if(head==null) {
System.out.println("头结点不能为空");
return null;
}
if(head.getNext()==null){
System.out.println("只有头结点,链表无数据");
return null;
}
if(k<0 ||k >getLength()){
System.out.println("k节点不能小于0,或者大于链表节点数");
return null;
}
HeroNode tmp = head.getNext();
for (int i = 0; i < getLength()-k ; i++) {
tmp = tmp.getNext();
}
return tmp;
}
4、求链表有效节点个数
//获取到单链表的节点的个数(如果是带头结点的链表,需求不统计头节点)
public int getLength(){
int linkedLength=0;
if(head==null) {
System.out.println("头结点不能为空");
return -1;
}
if(head.getNext()==null){
System.out.println("只有头结点,链表无数据");
return 0;
}
HeroNode tmp = head;
while (tmp.getNext()!=null){
linkedLength++;
tmp=tmp.getNext();
}
return linkedLength;
}
五、打印显示

Java单链表的更多相关文章
- Java单链表反转 详细过程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...
- java 单链表 练习
练习一下java单链表的简单习题 package com.test1; import java.util.Stack; public class SingleListDemo { /** * 返回单链 ...
- Java单链表反转图文详解
Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...
- java单链表代码实现
用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...
- java单链表常用操作
总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K ...
- JAVA单链表的实现-不带头结点但带有尾指针
1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾 ...
- JAVA单链表的实现-不带头结点且没有尾指针
本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有 ...
- Java单链表简单实现* @version 1.0
package com.list; /** * 数据结构与算法Java表示 * @version 1.0 * @author 小明 * */ public class MyLinkedList { p ...
- java 单链表反转
最近与人瞎聊,聊到各大厂的面试题,其中有一个就是用java实现单链表反转.闲来无事,决定就这个问题进行一番尝试. 1.准备链表 准备一个由DataNode组成的单向链表,DataNode如下: pub ...
- Java单链表、双端链表、有序链表实现
单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见htt ...
随机推荐
- nginx读取请求体
请求体的读取一般发生在nginx的content handler中,一些nginx内置的模块,比如proxy模块,fastcgi模块,uwsgi模块等,这些模块的行为必须将客户端过来的请求体(如果有的 ...
- 遍历并读取指定目录下的所有文件内容,写入Map集合然后输出在控制台和本地文件
public class FileWrite { public static void main(String[] args) throws Exception { //封装数据源目录 File sr ...
- MTCNN 人脸检测
demo.py import cv2 from detection.mtcnn import MTCNN # 检测图片中的人脸 def test_image(imgpath): mtcnn = MTC ...
- 在虚拟机Linux中安装VMTools遇到的问题-小结
总结: 遇到的问题:No support for locale: zh_CN.utf8 可能的解决方法:1.sudo dpkg-reconfigure locale (重新配置?) 2.上一步失败,提 ...
- nodepad++如何多行同时编辑
notepad++ 可以选中alt按键进行选择 支持同时编辑多行
- windows下laravel 快速安装
1. 安装composer https://getcomposer.org/ 2. 安装git windows 客户端工具 https://git-scm.com/downloads 3. 更改co ...
- css 块级格式化上下文(BFC)
一.块级格式化上下文(BFC) 1.什么是块级格式化上下文? Block Formatting Contexts (BFC,块级格式化上下文)就是一个块级元素 的渲染显示规则 (可以把 BFC 理解为 ...
- php大文件断点续传
该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开始. 如何分 ...
- 特权第一讲--Lesson 1 课程概述与如何学好FPGA
FPGA的学习没有什么捷径,需要学习者多花时间和精力 . 1.设计输入 2.如何--对综合布局布线结果进行优化 3.如何--更有效地进行验证 4.如何--达到时序收敛 学习者需要用心去学习.去分析.去 ...
- 学习日记12、list集合中根据某个字段进行去重复操作
List<T_CusBankCardInfoModel> blist = B_BLL.GetListByCusId(CusIds).Distinct(new ModelComparer() ...