首先写完了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. python自动发布

    import os import paramiko baseconfig = { "ip": "121.4.38.187", "port": ...

  2. ES简介

    https://www.bbsmax.com/A/E35pW7LEJv/ 1 什么是ES ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式的全文搜索引擎,其对外服务是基 ...

  3. 6、Collections工具类

    1.Collections工具类介绍 Collections 是一个操作 Set.List 和 Map 等集合的工具类 Collections 中提供了一系列静态的方法对集合元素进行排序.查询和修改等 ...

  4. 接口介绍以及postman的基本使用

    集成测试--测试接口 接口测试也是在测试执行阶段做 一.什么是接口 软件的不同模块之间互相发送数据的一个通道 二.接口的组成 1.请求URL--接口地址2.请求类型 get get请求的参数是暴露在U ...

  5. css当文字过长时,显示省略号

    /* 省略号三属性 */ /* 强制不换行 */ white-space: nowrap; /* 溢出隐藏 */ overflow: hidden; /* 省略号 */ text-overflow: ...

  6. JZOJ 4299. 【NOIP2015模拟11.2晚】舳舻牌

    题目 思路 倒序 \(DP\) 设 \(f_{i,j}\) 表示 \(A\) 先手,当前 \(A\) 报出的值为 \(i\),\(B\) 报出的值为 \(j\),\(A\) 取诱惑值大于等于 \(i\ ...

  7. VueJs 监听 window.resize 方法---窗口变化

    mounted() { let _this = this; window.onresize = ()=>{ return (()=>{ this.vscreen.height=docume ...

  8. pat乙级 1019 数字黑洞

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> ...

  9. LCD1602液晶屏

    单片机系统用到的液晶屏(简称LCD)有很多类型,最常用的有两种,一种是1602型(即每行可显示16个字符,同时能显示2行),另一种是12864型(即每行可显示128个点,每列可显示64个点).一般前一 ...

  10. 四种语言刷算法之 组合总和 II

    力扣40. 组合总和 II 1.C void back(int* candidates, int candidatesSize, int target,int start,int *path,int ...