9.java单链表初学代码复现及一些不值一提的小问题(2)
首先写完了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)的更多相关文章
- Java单链表反转 详细过程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...
- Java单链表反转图文详解
Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...
- java 单链表 练习
练习一下java单链表的简单习题 package com.test1; import java.util.Stack; public class SingleListDemo { /** * 返回单链 ...
- java单链表代码实现
用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...
- java单链表常用操作
总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K ...
- JAVA单链表的实现-不带头结点但带有尾指针
1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾 ...
- java 单链表反转
最近与人瞎聊,聊到各大厂的面试题,其中有一个就是用java实现单链表反转.闲来无事,决定就这个问题进行一番尝试. 1.准备链表 准备一个由DataNode组成的单向链表,DataNode如下: pub ...
- 用c#实现单链表(程序代码已经验证,完全正确)
1.程序的大致结构如下图: 2.下面依次列出各个类的代码 ①ILISTDs.cs 这是一个接口类,列出单链表的方法 using System; using System.Collections.Ge ...
- JAVA单链表的实现-不带头结点且没有尾指针
本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有 ...
- Java单链表简单实现* @version 1.0
package com.list; /** * 数据结构与算法Java表示 * @version 1.0 * @author 小明 * */ public class MyLinkedList { p ...
随机推荐
- 周末折腾了两天,踩了无数个坑,终于把win7装成了centos7
上周五的时候,突发奇想,想把自己的Thinkpad E430C的操作系统装成linux. 熟悉电脑的都知道Thinkpad E430C很古老了,现在算来从2012年买来,到现在已经经历了10个年头了. ...
- c++标准库string的使用完美总结——十分详细,复习学习记忆都可以使用
std::string详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足 ...
- 使用nvm时报错:exit status 1: ļ Ѵ ʱ ļ 的解决办法
1.出现问题 如图,安装完nvm后,使用[nvm use 版本号]命令切换版本,出现如题错误,具体截图如下 2.分析原因 1)安装路径是否包含中文 2)安装路径有空格 3)cmd使用是否是管理员方式打 ...
- C++练习9 函数的重载
函数的重载是用一个函数名定义多个函数,但是这些同名函数的形参列表(参数个数,类型,顺序)必须不同. 函数重载的规则: 1.函数名称必须相同. 2.参数列表必须不同(个数不同.类型不同.参数排列顺序不同 ...
- JZOJ 5451.Genocide
题目 题解 对于 \(m=1\) 这档分 我们可以 \(dp\) 然后斜率优化 具体来说就是 \(f_i = f_j + \frac{(i-j)\times (i-j+1)}{2} + sum[j]- ...
- CCRD_TOC_2008年第2期
中信国健临床通讯 2008年第2期 目 录 类风湿关节炎 1. 纵向分析TEMPO数据:放射学损伤程度和进展速率决定了关节物理功能 van der Heijde D, et al. Ann Rhe ...
- vue element-ui table 实现自动滚动效果
<el-table :data="tableData" stripe class="swiper-page-table" ref="table& ...
- python (),[], {}的含义
1.python ()表示元组,元组是一种不可变序列 1)创建如:tuple = (1,2,3) 取数据 tuple[0]...... tuple[0,2].....tuple[1,2]...... ...
- 基于Python的OpenGL 04 之变换
1. 概述 本文基于Python语言,描述OpenGL的变换 前置知识可参考: 基于Python的OpenGL 03 之纹理 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者这里 ...
- LeetCode-1610 可见点的最大数目
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-number-of-visible-points 题目描述 给你一个点数组 poi ...