java 单链表 练习
练习一下java单链表的简单习题
package com.test1;
import java.util.Stack;
public class SingleListDemo {
/**
* 返回单链表的总长度
* @param sl
* @return
*/
public static <T> int getListLength(SingleList<T> sl) {
Node<T> temp = sl.headNode.next;
int index = 0;
while(temp != null) {
temp = temp.next;
index++;
}
return index;
}
/**
* 查找单链表中倒数第k个元素
* @param sl
* @param k
* @return
*/
public static <T> Node<T> getLastK(SingleList<T> sl, int k){
int length = getListLength(sl);
if(length < k) {
throw new RuntimeException("不存在倒数第" + k + "个节点");
}
int index = length - k;
Node<T> temp = sl.headNode.next;
while(index != 0) {
temp = temp.next;
index--;
}
return temp;
}
/**
* 单链表的反转
* @param <T>
* @param args
*/
public static <T> void reverseList(SingleList<T> sl){
int length = getListLength(sl);
if(length == 1) {
return;
}
Node<T> headNode = sl.headNode;
Node<T> last = headNode.next;
Node<T> cur = last.next;
Node<T> next = cur.next;
last.next = null;
while(next != null) {
cur.next = last;
last = cur;
cur = next;
next = next.next;
}
cur.next = last;
sl.headNode.next = cur;
}
/**
* 从尾到头打印单链表 (利用栈)
* @param <T>
* @param args
*/
public static <T> void printReverseList1(SingleList<T> sl) {
Node<T> temp = sl.headNode.next;
Stack<T> stack = new Stack<>();
while(temp != null) {
stack.push(temp.data);
temp = temp.next;
}
while(!stack.empty()) {
System.out.println(stack.pop());
}
}
/**
* 从尾到头打印单链表 (利用递归) 很是牛逼!
* @param <T>
* @param args
*/
public static <T> void printReverseList2(Node<T> node) {
if(node.next != null) {
printReverseList2(node.next);
}
System.out.println(node.data);
}
/**
* 合并两个有序的单链表,合并之后的单链表任然有序
* @param <T>
* @param args
*/
public static <T> SingleList<T> mergeTwoList(SingleList<T> sl1, SingleList<T> sl2) {
SingleList<T> result = new SingleList<>();
Node<T> temp1 = sl1.headNode.next;
Node<T> temp2 = sl2.headNode.next;
while(temp1 != null && temp2 != null) {
if(temp1.compareTo(temp2) < 0) {
Node<T> temp = temp1;
temp1 = temp1.next;
temp.next = null;
result.addNode(temp);
} else {
Node<T> temp = temp2;
temp2 = temp2.next;
temp.next = null;
result.addNode(temp);
}
}
Node<T> temp = temp1 == null ? temp2 : temp1;
while(temp != null) {
result.addNode(temp);
temp = temp.next;
}
return result;
}
public static void main(String[] args) {
// SingleList<String> sl = new SingleList<>();
// sl.addNode(new Node<>("李四", null));
// sl.addNode(new Node<>("张三", null));
// sl.addNode(new Node<>("王五", null));
// sl.addNode(new Node<>("赵六", null));
// sl.showData();
// System.out.println(getListLength(sl));
// Node<String> node = getLastK(sl, 2);
// System.out.println(node);
// reverseList(sl);
// System.out.println("\n反转之后为:");
// sl.showData();
// System.out.println("\n从尾到头打印单链表");
// printReverseList2(sl.headNode.next);
// Node<Integer> a = new Node<>(1, null);
// Node<Integer> b = new Node<>(2, null);
// System.out.println(a.compareTo(b));
SingleList<Integer> sl = new SingleList<>();
sl.addNodeOrder(new Node<>(1, null));
sl.addNodeOrder(new Node<>(3, null));
sl.addNodeOrder(new Node<>(70, null));
sl.addNodeOrder(new Node<>(2, null));
sl.showData();
SingleList<Integer> sl1 = new SingleList<>();
sl1.addNodeOrder(new Node<>(11, null));
sl1.addNodeOrder(new Node<>(13, null));
sl1.addNodeOrder(new Node<>(17, null));
sl1.addNodeOrder(new Node<>(12, null));
sl1.showData();
System.out.println("\n合并之后为:");
SingleList<Integer> result = mergeTwoList(sl, sl1);
result.showData();
}
}
class Node<T> implements Comparable<Node<T>>{
public T data;
public Node<T> next;
public Node(T data, Node<T> next) {
super();
this.data = data;
this.next = next;
}
@Override
public String toString() {
return this.data.toString();
}
@SuppressWarnings("unchecked")
@Override
public int compareTo(Node<T> o) {
if(o.data instanceof Comparable) {
return ((Comparable<Comparable<?>>) this.data).compareTo((Comparable<?>) o.data);
}
return 0;
}
}
class SingleList<T>{
public Node<T> headNode = new Node<>(null, null);
/**
* 往尾部添加节点
* @param node
*/
public void addNode(Node<T> node) {
Node<T> temp = headNode;
while(temp.next != null) {
temp = temp.next;
}
temp.next = node;
}
/**
* 按照节点的大小添加节点,使得链表有序
*/
public void addNodeOrder(Node<T> node) {
Node<T> last = headNode;
Node<T> temp = last.next;
while(temp != null && temp.compareTo(node) < 0) {
last = temp;
temp = temp.next;
}
if(temp != null && temp.compareTo(node) == 0) {
throw new RuntimeException("已经存在相同的节点,不允许再次添加");
}
last.next = node;
node.next = temp;
}
/**
* 显示list中的数据
*/
public void showData() {
Node<T> temp = headNode.next;
while(temp != null) {
System.out.print(temp + " ");
temp = temp.next;
}
}
}
java 单链表 练习的更多相关文章
- Java单链表反转 详细过程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...
- 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 ...
随机推荐
- C语言每日一练——第1题
一.程序功能 程序的功能是:将大于整数m且紧靠m的k个素数存入数组xx.并把in.dat文件的内容输入到程序,并把输出结果输出道out.dat文件夹中例如:若输入17,5 则应该输入:19,23,29 ...
- c++ const问题小记
int* a = new int; const int* b = a; const int* a = new int; int* b = (int*)a; const int m = 10; int ...
- i++和++i的区别(主要为返回的值的区别)
初学者经常会搞不清i++,和++i 的关系 i++ 是把i的值拿过来,然后再+1++i 是吧i的值直接+1,之后再用
- Base64编码原理及应用
最近在做一个H5上传图片并压缩的项目,其过程主要是先将图片上传通过readAsDataURL获取上传图片base64编码,然后根据高宽比将图片画到canvas上实现压缩,在通过toDataURL获取压 ...
- Python基础-day01-4
多文件项目的演练 开发 项目 就是开发一个 专门解决一个复杂业务功能的软件 通常每 一个项目 就具有一个 独立专属的目录,用于保存 所有和项目相关的文件 一个项目通常会包含 很多源文件 目标 在项目中 ...
- conda docker镜像
之前的python环境,使用ubuntu安装pip来安装python依赖,但是遇到缺少某些库的版本,比如一个项目需要用到faiss,pip只有最新的1.5.3版本,但是这个版本使用了较新的CPU指令, ...
- More than one file was found with OS independent path 'lib/armeabi-v7a/libgnustl_shared.so'
More than one file was found with OS independent path 'xxx/xxx' 这个错误是在路径中出现了重复依赖. 解决办法是配置打包选项, 在 and ...
- oop面向对象【接口、多态】
今日内容 1.接口 2.三大特征——多态 3.引用类型转换 教学目标 1.写出定义接口的格式 2.写出实现接口的格式 3.说出接口中成员的特点 4.能够说出使用多态的前提条件 5.理解多态的向上转型 ...
- Linux下利用coredump技术追查进程崩溃原因
原文链接:https://blog.csdn.net/u014585564/article/details/68063269 最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了cored ...
- asp.net core 3.0获取web应用的根目录
目录 1.需求 2.解决方案 1.需求 asp.net core 3.0的web项目中,在controller中,想要获取wwwroot下的imgs/banners文件夹下的所有文件: 在传统的asp ...