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 ...
随机推荐
- mybatis初级映射
一 前言 系统学习知识请认准知识追寻者(同公众号),错过作者,你有可能要走好多弯路 经过第一篇的入门文章,小白们都对mybatis的搭建流程应该都很熟悉,这篇文章主讲的是如何使用mybatis实现数据 ...
- 冒泡排序(表格说明)(js)
冒泡排序我自己的理解是(假设从大到小): 比较每一对相邻元素的值,如果前面的元素小于后面的元素那么就将它们交换过来,每次排序的比较次数逐次递减,最后的比较次数为1.总的排序轮数为数组长度减1.为了便于 ...
- JVM系列二(垃圾收集算法).
一.标记-清除算法(Mark-Sweep) 这种算法分为"标记"和"清除"两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. Mar ...
- SpringBoot微服务电商项目开发实战 --- 全局异常处理
上一篇文章讲了Redis缓存的安全防范及Kafka的接入及消息实现,今天接着前面的内容基础说说项目的优化和基础配置,今天要讲的内容主要是Spring Boot项目中的全局异常处理.为什么要做这件事呢? ...
- python 多线程编程之threading模块(Thread类)创建线程的三种方法
摘录 python核心编程 上节介绍的thread模块,是不支持守护线程的.当主线程退出的时候,所有的子线程都将终止,不管他们是否仍在工作. 本节开始,我们开始介绍python的另外多线程模块thre ...
- JS---案例:简单轮播图
案例:简单轮播图 div叫盒子,里面包了2个小盒子,一个是inner,一个是square inner的div是放ul,里面有li,a,和图片 square的div里面放span,是轮播图的小点 < ...
- 设置openwrt路由器的防火墙_允许从外网访问内网的ipv6服务
设置openwrt路由器的防火墙_允许从外网访问内网的ipv6服务 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-02. 参考文章: IPv6"内网"设备 ...
- UWP 记一次x64平台无法单步调试的bug
是这样的,平时开发uwp程序,都是用x86架构进行部署和调试.但是有时候需要在XBOX上进行调试,所以架构需要改成x64进行操作. 但是最近x64位下不能进行调试了. 搜遍网上的各种教程,也是各有各的 ...
- aop的应用和简单原理
实现过程: 1.pom引包 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
- HALCON数据类型和C#对应数据类型的对比
摘要:HALCON数据类型:Iconic Variables(图形变量).Control Variables(控制变量).在C#中,图形变量用HObject声明,控制变量用HTuple声明.(halc ...