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 ...
随机推荐
- JSP学习(3)
JSP学习(3) JSP内置对象 Web容器创建的一组对象,不使用new关键字就可以使用的内置对象 用户服务器请求 缓冲区:Buffer,就是内存的一块区域,用来保存临时数据. get与post的区别 ...
- OGG-01169
OGG-01169 Oracle GoldenGate Delivery for Oracle, dwarer.prm: Encountered an update where all key c ...
- BZOJ2440/洛谷P4318 [中山市选2011]完全平方数 莫比乌斯函数
题意:找到第k个无平方因子数. 解法:这道题非常巧妙的运用了莫比乌斯函数的性质! 解法参考https://www.cnblogs.com/enzymii/p/8421314.html这位大佬的.这里我 ...
- 2017ICPC南宁M The Maximum Unreachable Node Set (偏序集最长反链)
题意:给你一张DAG,让你选取最多的点,使得这些点之间互相不可达. 思路:此问题和最小路径可重复点覆盖等价,先在原图上跑一边传递闭包,然后把每个点拆成两个点i, i + n, 原图中的边(a, b)变 ...
- Git常用命令的操作
Git命令 一.创建版本库 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 使用命令git add <file>,注意,可反复多次使用,添加多个文件: 使 ...
- selenium 自动化的坑(1)
UI自动化,一天一坑系列(1) 不要试图自作聪明添加一些不必要的东西. 个人遇到的问题关于下拉框的,本来一个下拉框连续点击两次就好了,结果自己多余将谷歌的提示‘正在受到自动化控制’去掉了,导致原本很简 ...
- javascript实现表单提交加密
javascript实现表单提交加密 通常表单的提交有两种方式,一是直接通过html的form提交,代码如下: <form action="" method="&q ...
- netty模型简介
Netty工作原理图 netty抽象出了两组线程池,BossGroup专门负责客户端 的连接,WorkerGroup专门负责网络读写. BossGroup和WorkerGroup 类型都是NioEve ...
- php substr_count()函数 语法
php substr_count()函数 语法 作用:统计一个字符串,在另一个字符串中出现次数大理石量具 语法:substr_count(string,substring,start,length) ...
- Linux内核设计与实现 总结笔记(第四章)进程调度
进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间. 调度程序没有太复杂的原理,最大限度地利用处理器时间的原则是,只要有可以执行的进程,那么就总会有进程正在执行. 一.多任务 多任 ...