一、概述

二、主方法

  //创建头结点
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单链表的更多相关文章

  1. Java单链表反转 详细过程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...

  2. java 单链表 练习

    练习一下java单链表的简单习题 package com.test1; import java.util.Stack; public class SingleListDemo { /** * 返回单链 ...

  3. Java单链表反转图文详解

    Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...

  4. java单链表代码实现

    用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...

  5. java单链表常用操作

    总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K ...

  6. JAVA单链表的实现-不带头结点但带有尾指针

    1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾 ...

  7. JAVA单链表的实现-不带头结点且没有尾指针

    本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有 ...

  8. Java单链表简单实现* @version 1.0

    package com.list; /** * 数据结构与算法Java表示 * @version 1.0 * @author 小明 * */ public class MyLinkedList { p ...

  9. java 单链表反转

    最近与人瞎聊,聊到各大厂的面试题,其中有一个就是用java实现单链表反转.闲来无事,决定就这个问题进行一番尝试. 1.准备链表 准备一个由DataNode组成的单向链表,DataNode如下: pub ...

  10. Java单链表、双端链表、有序链表实现

    单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见htt ...

随机推荐

  1. spark复习笔记(4):spark脚本分析

    1.[start-all.sh] #!/usr/bin/env bash # # Licensed to the Apache Software Foundation (ASF) under one ...

  2. kali优化配置(1)

    前言 无论是工具还是物理机.虚拟机,我都遇到过惨绝人寰的配置错误.为了有效避免这些烦恼困住我,写一个排错文档之外,我还应当谨慎小心,从每一次配置走起..我的kali昨日的MySQL无法登陆,也没办法联 ...

  3. python时间测量

    使用自定义装饰器测量时间 def test_time(func): def inner(*args, **kw): t1 = datetime.datetime.now() print('开始时间:' ...

  4. python面向对象--item方法

    class Foo: def __getitem__(self, item): print("getitem") return self.__dict__[item] def __ ...

  5. Codeforces Round #426 (Div. 2) - A

    题目链接:http://codeforces.com/contest/834/problem/A 题意:给定4个图标,某些图标经过顺时针/逆时针旋转90°后能得到另外一些图标.现在给你开始的图标和结束 ...

  6. BZOJ3129/洛谷P3301方程(SDOI2013)容斥原理+扩展Lucas定理

    题意:给定方程x1+x2+....xn=m,每个x是正整数.但是对前n1个数做了限制x1<=a1,x2<=a2...xn1<=an1,同时对第n1+1到n1+n2个数也做了限制xn1 ...

  7. HTML5 音频播放

    代码实例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  8. 文本框的pattern属性

    代码实例: test.html <!DOCTYPE html><html lang="en"><head> <meta charset=& ...

  9. 封装 pyinstaller -F -i b.ico excel.py

    安装pywin32,可以参考<怎么给python安装pywin32模块?> 一定要注意对应的python版本,否则不能安装.   5怎么给python安装pywin32模块?   2 用命 ...

  10. Selenium-Switch与SelectApi介绍

    Switch 我们在UI自动化测试时,总会出现新建一个tab页面,弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了.需要用到Se ...