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 ...
随机推荐
- adb 链接网络 connect 安装apk install 断开IP链接 kill-server 连接数devices
https://blog.csdn.net/zhonglunshun/article/details/78362439 ./adb connetc 192.168.1.11 ./adb install ...
- java 中的引用类型
GC基本原理 GC (Garbage Collection)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征 ...
- Conference - open source drives IOT from device to edge
Open source drives IOT from device to edge 以下都是针对IOT领域的项目: ACRN A Big Little Hypervisor for IoT Deve ...
- element中的表格处理:循环出表格数据
最近要做一个表格,但是为了方便维护,我们需要把表格数据循环出来,方便加减节点: <template> <el-table :data="tableData" st ...
- darknet-yolov3使用opencv3.4.8时,undefined reference 'imshow()'、'waitKey()'、'nameWindows()'
解决办法:暴力卸载 卸载办法:进入到opencv3.4.8的安装目录下:make uninstall 然后重新安装了其他版本的,立马编译通过了.
- 按照MySQL
转载自:https://mp.weixin.qq.com/s?__biz=MzIwNzk0NjE1MQ==&mid=2247484200&idx=1&sn=6eed12242c ...
- CKeditor粘贴图片在IE下自动上传的研究
我司需要做一个需求,就是使用富文本编辑器时,不要以上传附件的形式上传图片,而是以复制粘贴的形式上传图片. 在网上找了一下,有一个插件支持这个功能. WordPaster 安装方式如下: 直接使用Wor ...
- POJ 2253 Frogger ( 最短路变形 || 最小生成树 )
题意 : 给出二维平面上 N 个点,前两个点为起点和终点,问你从起点到终点的所有路径中拥有最短两点间距是多少. 分析 : ① 考虑最小生成树中 Kruskal 算法,在建树的过程中贪心的从最小的边一个 ...
- [CF959E]Mahmoud and Ehab and the xor-MST题解
解法 又是一道结论题? 我的做法比较奇怪且没有证明 #include <cstdio> #include <cmath> #define ll long long int ma ...
- Spring MVC--------处理方法返回值的可选类型
对于Spring MVC处理方法支持支持一系列的返回方式: (1)ModelAndView (2)Model (3)ModelMap (4)Map (5)View (6)String (7)Void ...