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 ...
随机推荐
- linux 验证 NFS 是否成功
服务器端----->>客户端 1. 服务器端 [root@allentuns ~]# ifconfig |grep "Bcast" inet addr:192.168. ...
- JavaScript版EAN码校验算法
<script type="text/javascript"> $(document).ready(function () { $("#btnCalc&q ...
- 团队中的 Git 实践
转载自:https://segmentfault.com/a/1190000004963641 本文首发于欧雷流.由于我会时不时对文章进行补充.修正和润色,为了保证所看到的是最新版本,请阅读原文. 在 ...
- Nginx 的总结
目录 Nginx 的产生 Nginx 的用武之地 Web 服务器对比 Nginx 的产生 Nginx 同 Apache 一样都是一种 Web 服务器.基于 REST 架构风格,以统一资源描述符(Uni ...
- [NOI1999]生日蛋糕(搜索)
[NOI1999]生日蛋糕 题目背景 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层 生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半 ...
- 随笔2 AbstractMap<K,V>
上一篇写了Map接口的源码分析,这一篇写一下Map接口的一个实现类AbstractMap,从名字就可以看出这是一个抽象类,提供了Map接口的骨架实现,为我们实现Map接口的时候提供了很大的便利.在这里 ...
- $2019$各种$WC$没去记
\(2019\)各种\(WC\)没去记 太弱了去不了啊. 至少我联赛没退役是吧...(退役感++ 不过这个分数线还是有点让人自闭啊,划线人绝对有毒,有人关照一下空巢老人\(mona\)喵? 这里大概是 ...
- 前端面试题(4)JavaScript
前端面试题JavaScript(一) JavaScript的组成 JavaScript 由以下三部分组成: ECMAScript(核心):JavaScript 语言基础 DOM(文档对象模型):规定了 ...
- mpvue实现微信小程序(欢迎踩坑)
最近刚使用mpvue完成了微信小程序的开发,写点东西,做个记录. 首先依旧是两个传送门: 微信小程序文档:[https://developers.weixin.qq.com/miniprogram/d ...
- php array_fill()函数 语法
php array_fill()函数 语法 作用:用键值填充数组.大理石平台价格 语法:array_fill(index,number,value) 参数: 参数 描述 index 必需.被返回数组的 ...