练习一下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. C++类成员默认初始值

    有时候我们会不给C++类成员变量赋初始值,或是因为忘记在构造函数中指定(C++11可以写在类内),或是觉得没有必要写.然而,因为觉得编译器会把变量赋成0而不写是错误的.本文通过C++标准来解释这个问题 ...

  2. 关于HPS和FPGA之间的桥接学习笔记一

    为了实现FPGA和HPS之间的存储器共享和数据传输,Altera SoC FPGA提供了两种方式用于FPGA和HPS通信.分别是FPGA to SDRAM和AXI bridge. FPGA to SD ...

  3. 2016/09/22 mapreduce

    1.概念 Mapreduce是一个计算框架,表现形式是有个输入(input),mapreduce操作这个输入,通过本身定义好的计算模型,得到一个输出(output),也就是我们需要的结果. 在运行一个 ...

  4. python多线程编程—同步原语入门(锁Lock、信号量(Bounded)Semaphore)

    摘录python核心编程 一般的,多线程代码中,总有一些特定的函数或者代码块不希望(或不应该)被多个线程同时执行(比如两个线程运行的顺序发生变化,就可能造成代码的执行轨迹或者行为不相同,或者产生不一致 ...

  5. JS---DOM---事件冒泡和阻止事件冒泡,总结事件

    事件冒泡: 多个元素嵌套, 有层次关系 ,这些元素都注册了相同的事件, 如果里面的元素的事件触发了, 外面的元素的该事件自动的触发了     事件有三个阶段: 1.事件捕获阶段  :从外向内 2.事件 ...

  6. 精通awk系列(14):细说awk中的变量和变量赋值

    回到: Linux系列文章 Shell系列文章 Awk系列文章 awk变量 awk的变量是动态变量,在使用时声明. 所以awk变量有3种状态: 未声明状态:称为untyped类型 引用过但未赋值状态: ...

  7. 我如何通过K8S开发认证(CKAD)考试

    题记:笔者最近经过3个多月的空余时间准备,终于通过了K8S开发认证(CKAD)的考试,在这里简单给大家分享一下经验. 一,先科普下CKAD 众所周知,Kubernetes在容器编排器大战中脱颖而出后, ...

  8. JsonPath基本用法

    JsonPath基本用法 本文主要介绍JsonPath的基本语法,并演示如何在Newtonsoft.Json中进行使用. JsonPath的来源 看它的名字你就能知道,这家伙和JSON文档有关系,正如 ...

  9. IT兄弟连 HTML5教程 使用盒子模型设计页面布局

    布局所涉及的技术非常很多,足以另写单独的一本书了.在本节中主要介绍网站中最常用的布局方案,包括区块框居中.两列浮动.三列浮动及多列浮动的区块框. 1  居中设计 区块框居中的设计是在网页布局中常用的技 ...

  10. JS---DOM---总结获取元素的方式

    总结获取元素的方式 1. 根据id属性的值获取元素,返回来的是一个元素对象 document.getElementById("id属性的值"); document.getEleme ...