练习一下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 单链表 练习的更多相关文章

  1. Java单链表反转 详细过程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...

  2. Java单链表反转图文详解

    Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...

  3. java单链表代码实现

    用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String ...

  4. java单链表常用操作

    总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K ...

  5. JAVA单链表的实现-不带头结点但带有尾指针

    1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾 ...

  6. JAVA单链表的实现-不带头结点且没有尾指针

    本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有 ...

  7. Java单链表简单实现* @version 1.0

    package com.list; /** * 数据结构与算法Java表示 * @version 1.0 * @author 小明 * */ public class MyLinkedList { p ...

  8. java 单链表反转

    最近与人瞎聊,聊到各大厂的面试题,其中有一个就是用java实现单链表反转.闲来无事,决定就这个问题进行一番尝试. 1.准备链表 准备一个由DataNode组成的单向链表,DataNode如下: pub ...

  9. Java单链表、双端链表、有序链表实现

    单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见htt ...

随机推荐

  1. Centos7调整root分区大小

    由于centos安装完毕后一般给root只有50G左右,而home牛大, 所以多数时候需要把home弄小,root给扩展大一点 折腾一下 首先切好用户到root用户登陆,我用的systemctl se ...

  2. 《Dotnet9》系列-FluentValidation在C# WPF中的应用

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  3. 初步了解JVM第二篇

    在一篇<初步了解JVM第一篇>中,我们已经了解了: 类加载器:负责加载*.class文件,将字节码内容加载到内存中.其中类加载器的类型有如下: 启动类加载器(Bootstrap) 扩展类加 ...

  4. Ghost手动备份、还原系统详细图文教程

    1.Ghost工具下载 https://pan.baidu.com/s/10cpRhhjJAHZb5PPZo6ghvw 2.备份.还原详细步骤请参考 https://jingyan.baidu.com ...

  5. Cesium专栏-地形开挖2-任意多边形开挖(附源码下载)

    “任意多边形地形开挖” 是“地形开挖”的补充篇,在这节里,我们介绍关于如何使用任意多边形对地形进行开挖,同时,由于有不少小伙伴也咨询了关于“地形开挖”篇后序内容中的填充地形的效果,之前没放出来,是想让 ...

  6. 解决Android调用相机拍照,要报“打开相机失败”查看debug日志显示“setParameters failed”的问题

    使用CameraLibrary项目,在部分手机或平板上不能正常使用,要报“打开相机失败”查看debug日志显示“setParameters failed”. 找到CameraView.java中的se ...

  7. CODING 代码多仓库实践

    关于代码的管理问题已经讨论多年,随着企业业务的复杂度提高.软件行业技术栈的选择度变宽泛,现代软件的代码仓库也变得越来越庞大和复杂.一个中型项目,将测试代码.核心业务代码.编译构建.部署打包等基础设施的 ...

  8. Linux下使用docker 拉取 vsftpd 镜像搭建 Ftp 服务器,连接 Ftp 时遇到的错误(425 Failed to establish connection)

    Ftp踩坑系列: Linux上的ftp服务器 vsftpd 之配置满天飞--设置匿名用户访问(不弹出用户名密码框)以及其他用户可正常上传 ftp服务器Serv-U 设置允许自动创建不存在的目录 FTP ...

  9. OpenStack与ZStack深度对比:架构、部署、计算、运维监控等

    摘要 OpenStack从2010年开源至今,已经走过9个年头,其正在进入主流企业市场,但该项目依然面临较难部署和管理的老问题.有一点是毫无疑问的,那就是OpenStack保持着高速增长的态势,超过5 ...

  10. 基于Python和Xtrbackup的自动化备份与还原实现

    xtrabackup是一个MySQL备份还原的常用工具,实际使用过程应该都是shell或者python封装的自动化脚本,尤其是备份.对还原来说,对于基于完整和增量备份的还原,还原差异备份需要指定增量备 ...