首先写完了update和delete函数,在之前的铺垫下。倒是不难,结构和之前的都相同,遍历找到节点后处理该节点。代码如下

public void update(teamNode node){
teamNode temp=head;
boolean flag=false;
while(true){ if (temp.no== node.no){
flag=true;
break;
}
if(temp.next==null) break;
temp=temp.next;
}
if(!flag){
System.out.println("无该名次队伍");
}else {
temp.name= node.name;
temp.point=node.point;
}
}
public void delete(int n){
teamNode temp=head;
boolean flag=false;
while(true){
if(temp.next==null) break;
if (temp.next.no== n){
flag=true;
break;
} temp=temp.next;
}
if(!flag){
System.out.println("无该名次队伍");
}else {
temp.next=temp.next.next;
}
}

此外,还有一些关于单链表的题:

1、单链表中的有效节点数

思路为遍历获取节点个数,带头节点的话需要不计入。步骤为:传入头节点,判断是否为空链表,不为则创建辅助节点,遍历整个链表。

public static int getlength(teamNode node){
if(node.next==null){
return 0;
}
int len=0;
teamNode temp=node;
while (temp!=null){
len++;
temp=temp.next;
}
return len;
}

2、查找单链表中的倒数第k个节点。

方法参数为头节点和一个int代表倒数第几个节点。得到链表长度后,判断此节点是否存在。若存在则遍历链表到(len-k)个即可得到该节点。未找到的话返回null

public static teamNode findnode(teamNode head,int k){
if(head.next==null){
return null;
}
int len=getlength(head);
if(k<=0||k>len) return null;
teamNode temp=head.next;
for (int i=0;i<len-k;i++){
temp=temp.next;
}
return temp;
}

除了此思路还有一种是用双指针,让两个指针相隔k个位置,当后方的指针指到空时,前指针则指向倒数第k个节点。

3、单链表的反转

思路简单来说就是新建一个头节点,将原链表的节点一个个取出,用头插法插入新链表,最后将原头节点与链表相连接。

仔细说分为一下几步,先创建一个新的头节点,然后开始遍历原链表,拿出节点后永远放在新链表的头节点之后,即新链表有效数据的第一个,最后将原链表的头节点的next连到新链表的第一个节点上即可。

此函数最开始不仅要判断原链表是否为空,若原链表只有一个节点,其也不用反转,直接返回原链表即可。

在遍历时,因为被遍历到的节点需要“拿出来”去改变其next,所以需要一个node来临时保存其next,让我们能获得下一个节点。因为被遍历到的节点的next要去连接新链表的值,若不保存,原来指向的那个节点还未被遍历到,覆盖后就无法得到那个节点了。

所以在此处要创建三个节点,一为辅助节点temp,一为临时保存的next节点,一为新链表的头节点。

public static void reverse(teamNode head){
if(head.next==null||head.next.next==null){
return;
}
teamNode temp=head.next;
teamNode next=null;
teamNode rehead=new teamNode(0,"","");
while (temp!=null){
next=temp.next;
temp.next=rehead.next;
rehead.next=temp;
temp=next;
}
head.next=rehead.next;
}

4、从尾到头打印单链表

可以先利用上面的函数反转了再打印,但会导致原链表彻底变化(当然打印完再转一遍也不是不行。。)但此处选择用栈 stack来解决。利用其先进后出的原理来解决该题。其中,利用Stack<teamNode> stack=new Stack<teamNode>();可创建栈,栈中的数据形式可自定义,此处为node。

其中,stack.add()stack.push()为入栈,

stack.pop()为取出并返回栈顶的第一个数据。

因为题目要求为打印,因此不用形成链表,有输出即可。

public  static void reprint(teamNode head){
if (head!=null){
return;
}
Stack<teamNode> stack=new Stack<teamNode>();
teamNode temp=head.next;
while (temp!=null){
stack.push(temp);
temp=temp.next;
}
while (stack.size()>0){
System.out.println(stack.pop());
}
}

写完这些我可以说是对单链表确实的有了更深的理解,在之前就有所了解数据结构的基础上,可以说是对java中的链表有了进一步的了解。但当看到最后一题用的栈时,我在想java中是不是也有这样已经给我们写好的基本链表定义和一些函数呢,不然难道每次需要用到链表的时候都需要重新这样从头开始定义一遍嘛。很显然,我的懒鬼想法是大多数人的想法,java当然有直接的定义和预先写好的函数。但对于此些API和定义我还尚且不太清楚。

9.java单链表初学代码复现及一些不值一提的小问题(2)的更多相关文章

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

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

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

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

  3. java 单链表 练习

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

  4. java单链表代码实现

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

  5. java单链表常用操作

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

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

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

  7. java 单链表反转

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

  8. 用c#实现单链表(程序代码已经验证,完全正确)

    1.程序的大致结构如下图: 2.下面依次列出各个类的代码 ①ILISTDs.cs  这是一个接口类,列出单链表的方法 using System; using System.Collections.Ge ...

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

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

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

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

随机推荐

  1. JAVA虚拟机07-垃圾回收-分代收集理论和垃圾收集算法

    1.分代收集理论 1.1分代收集理论假说 1.2分代收集理论奠定的垃圾收集器原则 1.3基于分代收集理论的内存划分-跨代引用假说 2.垃圾回收 3.垃圾收集算法 3.1标记-清除算法 3.2标记-复制 ...

  2. 分布式机器学习:异步SGD和Hogwild!算法(Pytorch)

    1 导引 我们在博客<分布式机器学习:同步并行SGD算法的实现与复杂度分析(PySpark)>和博客<分布式机器学习:模型平均MA与弹性平均EASGD(PySpark) >中介 ...

  3. vue-cli环境搭建 (超详细保姆级教程)

    一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...

  4. LG P3809 【模板】后缀排序

    贴模板 注意:\(\text{id}\) 表示第二关键字排序后(其实无需排序,利用上轮的 \(\text{sa}\) 值即可)相应的第一关键字的位置 计数排序为了稳定性最后确定位置时要倒着开始 复制的 ...

  5. JZOJ 2020.02.25【NOIP提高组】模拟A 组

    闲话 难度似乎比之前的简单了一些 但是难的题还是很难(我太菜了) 总结 针对三个题,先罗列正解所涉及的算法:字符哈希,组合数学,点分治 最后一个不会 组合数学?还好吧 字符哈希? 放在 \(T1\) ...

  6. Echarts —自定义label标签的样式(formatter,rich,添加图标等操作)

    最近公司项目中在使用 Echarts 绘制图表时,由于默认的 label 标签不能满足设计稿需求,所以研究了对 label标签进行格式化的方案,了解到可以使用 formatter 内容格式器对标签内容 ...

  7. Postgresql WAL日志浅析

    一.预写日志(WAL) 预写式日志(Write Ahead Log,WAL)是保证数据完整性的一种标准方法.简单来说,WAL的中心概念是数据文件(存储着表和索引)的修改必须在这些动作被日志记录之后才被 ...

  8. 自己动手从零写桌面操作系统GrapeOS系列教程——8.x86介绍

    由于GrapeOS目前只支持x86,所以本讲我们简单的介绍一下x86. 百度百科上是这样介绍的:x86泛指一系列基于Intel 8086且向后兼容的中央处理器指令集架构. 中央处理器就是我们平时说的C ...

  9. python 在一个文件夹的所有文件中查找关键字

    python 在一个文件夹的所有文件中查找关键字 import os,shutil import re key='Hello' re_parttern=re.compile(r''+key,re.DO ...

  10. celery+redis的使用(异步任务、定时任务)

    目录 celery理解 安装celery+redis 异步任务使用 1.基础使用 新建task.py文件 在项目文件目录下执行python交互式编程 在项目文件目录下创建worker消费任务 2.使用 ...