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 ...
随机推荐
- java基础篇二
引言 滴,第二天卡. 五.关键字 -static -初始化顺序 -静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代 ...
- Ubuntu18.04 配置Cups PDF虚拟打印机服务
更新 sudo apt update && sudo apt upgrade -y 安装cups pdf服务 sudo apt-get install cups-pdf -y 修改配置 ...
- Ansible配置批量推送公钥到被管理端
01.yum安装ansible(推荐) sudo yum install ansible 02.配置被管理端主机IP清单 [root@ansible_50 ansible]$ cp /etc/ansi ...
- JavaScript图形实例:七彩线团
1.线团图案 设立坐标计算公式为: X=R1*COS(3α)+R2*COS(14α)) Y=R1*SIN(3α)+R2 *SIN(14α)) 再用循环依次取α值为0~2π(每次增量为0.01),计算出 ...
- Ajax 的基本使用
Ajax简介 一门异步的加载技术,局部刷新 异步加载,可以在不重载整个网页的前提下,进行局部刷新 分为原生和JQ两种 JSON数据格式 Json对象转字符串: JSON.stringify() 字符串 ...
- java基础题月考JSD1908(含答案和解析)
考试 .container { clear: both; margin: 0 auto; text-align: left; /*width: 1200px;*/ } .container:after ...
- python基础之元组讲解
概念讲解: 1.Python 的元组与列表十分相似,但是元组的元素只可读不可修改: 2.元组使用小括号,列表使用方括号: 3.元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. (1)创建一 ...
- linux 用户,组
权限: 所谓的权限是,由用户启动的进程,或者由操作系统启动的进程,可以访问哪些文件,不可以访问哪些文件. 进程太多了,不可能为每个进程定义权限对吧,所以进程的权限来自于启动进程的用户. 用户有哪些权限 ...
- LinuxProbe小结
1.修改主机名: /etc/hostname 2.配置 yum 软件仓库: (1)进入到 /etc/yum.repos.d/目录下,创建一个linuxprobe.repo的新文件(文件名称任意,结尾必 ...
- Consul初探-集成ocelot
前言 由于 Consul 的高可用性.丰富的API.友好的 Web 控制台界面等特点,Consul 的发展非常迅猛,得益于 .NETCore 社区的快速发展和社区成员的贡献,我们现在可以非常方便快速的 ...