题目要求:Java实现一个双向链表的倒置功能(1->2->3 变成 3->2->1)
提交:代码、测试用例,希望可以写成一个Java小项目,可以看到单元测试部分

该题目的代码,已经放到了我的github上,地址为:https://github.com/jiashubing/alibaba-linkedlist-reversed.git

最关键的是自定义节点Node 和自定义双向链表MyLinkedList 两个类,倒置的方法放在自定义链表类里reversed() ,具体的说明都在代码中

自定义节点类Node.java,有三个参数 :T data(当前值)、Node<T> left(左节点)、Node<T> right(右节点)

自定义双向链表类MyLinkedList.java,有两个参数:Node<T> head(头结点)、Node<T> current(当前节点,也是最后一个节点)

  添加节点的方法void add(T data):添加的第一个节点Node,它的左节点为null,最后一个节点的右节点也为null,中间的每个节点的左右节点都有值

  倒置链表的方法reversed():把每个节点的左右节点交换,并且把链表的首尾节点也交换,就可以了。这里需要考虑的是循环的终止条件。我的实现如下:

public void reversed() {
  if (head == null || head.getRight() == null) {
    return;
  }
  current = head;
  while(true) {
    //交换左右节点
    Node<T> tmp = head.getLeft();
    head.setLeft(head.getRight());
    head.setRight(tmp);

    //如果左节点为空,则终止,否则循环执行
    if (head.getLeft() == null) {
      return;
    } else {
      head = head.getLeft();
    }
  }
}

剩下的测试用例,就简单了。下面是我的github上的代码,记录下:

pom.xml

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>cn.jiashubing</groupId>
<artifactId>alitest</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies> </project>

Node.java

 package cn.jiashubing;

 /**
* 自定义节点
*
* @author jiashubing
* @since 2018/3/30
*/
class Node<T> { /**
* 当前值
*/
private T data; /**
* 左节点
*/
private Node<T> left; /**
* 右节点
*/
private Node<T> right; Node(T data) {
this.data = data;
this.left = null;
this.right = null;
} T getData() {
return data;
} void setData(T data) {
this.data = data;
} Node<T> getLeft() {
return left;
} void setLeft(Node<T> left) {
this.left = left;
} Node<T> getRight() {
return right;
} void setRight(Node<T> right) {
this.right = right;
}
}

MyLinkedList.java

 package cn.jiashubing;

 /**
* 自定义双向链表
*
* @author jiashubing
* @since 2018/3/30
*/
public class MyLinkedList<T> {
/**
* 头结点
*/
private Node<T> head; /**
* 当前节点
*/
private Node<T> current; /**
* 添加节点
* 如果头节点为空,则赋值为当前节点
* 否则,要双向设置,当前节点向后移动一位
*
* @param data 当前节点的值
*/
public void add(T data) {
if (head == null) {
head = new Node<T>(data);
current = head;
} else {
Node<T> tmp = new Node<T>(data);
current.setRight(tmp);
tmp.setLeft(current);
current = current.getRight();
}
} /**
* 正向打印链表
*
* @param node 当前节点
*/
public void print(Node<T> node) {
if (node == null) {
return;
} Node<T> tmp = node;
while (tmp != null) {
System.out.print(tmp.getData() + " ");
tmp = tmp.getRight();
}
System.out.println("");
} /**
* 反向打印链表
*
* @param node 当前节点
*/
public void printRev(Node<T> node) {
if (node == null) {
return;
} Node<T> tmp = node;
while (tmp != null) {
System.out.print(tmp.getData() + " ");
tmp = tmp.getLeft();
}
System.out.println("");
} /**
* 链表倒置
*/
public void reversed() {
if (head == null || head.getRight() == null) {
return;
}
current = head;
while(true) {
//交换左右节点
Node<T> tmp = head.getLeft();
head.setLeft(head.getRight());
head.setRight(tmp); //如果左节点为空,则终止,否则循环执行
if (head.getLeft() == null) {
return;
} else {
head = head.getLeft();
}
}
} public Node<T> getHead() {
return head;
} public Node<T> getCurrent() {
return current;
} }

JunitTest.java

 import cn.jiashubing.MyLinkedList;
import org.junit.Before;
import org.junit.Test; /**
* @author jiashubing
* @since 2018/3/30
*/
public class JunitTest { private MyLinkedList<Integer> list; @Before
public void setNum() {
list = new MyLinkedList<Integer>();
for (int i = 1; i < 4; i++) {
list.add(i);
}
System.out.println("正向打印: ");
list.print(list.getHead());
} @Test
public void test1() {
System.out.println("链表倒置后正向打印 ");
list.reversed();
list.print(list.getHead());
} @Test
public void test2() {
System.out.println("逆向打印 ");
list.printRev(list.getCurrent());
}
}

原创文章,欢迎转载,转载请注明出处!

Java实现一个双向链表的倒置功能的更多相关文章

  1. JAVA实现双向链表的增删功能

    JAVA实现双向链表的增删功能,完整代码 package linked; class LinkedTable{ } public class LinkedTableTest { //构造单链表 sta ...

  2. 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况

    用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...

  3. 用Java开发一个工具类,提供似于js中eval函数功能的eval方法

    今天在看到<Java疯狂讲义>中一个章节习题: 开发一个工具类,该工具类提供一个eval()方法,实现JavaScript中eval()函数的功能--可以动态运行一行或多行程序代码.例如: ...

  4. 跟踪LinkedList源码,通过分析双向链表实现原理,自定义一个双向链表

    1.LinkedList实现的基本原理 LinkedList是一个双向链表,它主要有两个表示头尾节点的成员变量first  .last,因其有头尾两个节点,所以从头或从尾操作数据都非常容易快捷.Lin ...

  5. 用php实现一个敏感词过滤功能

    周末空余时间撸了一个敏感词过滤功能,下边记录下实现过程. 敏感词,一方面是你懂的,另一方面是我们自己可能也要过滤一些人身攻击或者广告信息等,具体词库可以google下,有很多. 过滤敏感词,使用简单的 ...

  6. 为什么用 Java:一个 Python 程序员告诉你

    这篇文章专门给程序员写的,普通读者慎入.原作者:Kevin Sookocheff 译者:Celia Zhen,原文点击文末链接. 每当我告诉别人我一直在用Java工作时,大家的反应都是: “纳尼!Ja ...

  7. 利用java实现一个简单的远程监控程序

    一般的远程监控软件都是用c或者c++等语言开发的,而使用java如何来实现相同的功能呢. 首先我们先介绍一下一个简单的远程监控程序的实现原理. 功能一,远程屏幕监视 (1) 必须要有监控端与被监控端, ...

  8. java Html2Image 实现html转图片功能

    //java Html2Image 实现html转图片功能 // html2image  HtmlImageGenerator imageGenerator = new HtmlImageGenera ...

  9. EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充

    EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) EO理论上 ...

随机推荐

  1. 关于jsp中jstl-core标签循环遍历的使用

    JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了这些,它还提供 ...

  2. Truncated Power Method for Sparse Eigenvalue Problems

    目录 算法 k的选择 \(x\)的初始化 代码 抱歉,真的没怎么看懂,当然,估计和我现在没法静下心来好好看也有关系. 算法 想法非常非常简单吧,就是在原来幂法的基础上,每次迭代的时候再加个截断.当然, ...

  3. 助教总结 -【福大软工实践-2017-2018-K班】

    助教总结 -[福大软工实践-2017-2018-K班] 非常抱歉这么晚才来写总结! 助教工作 助教共发表博客39篇. 助教共点评约500条. 起步 对于常规课程的起步,通常都是在第一次课堂上由老师对课 ...

  4. marMariaDB & MYSQL flexviews

    Using Flexviews - part one, introduction to materialized views - Percona Database Performance Bloght ...

  5. WCF使用相关

    1.不显示WCF服务主机 在WCF项目属性中的WCF选项卡总关闭下图的选项 2.在其他项目中承载WCF服务 其他加载的操作一致,需要把WCF的endpoint和behavior节点复制到 启动服务的那 ...

  6. Oracle pivot行转列函数案例

    with temp as( select '湖北省' province,'武汉市' city,'第一' ranking from dual union all select '湖北省' provinc ...

  7. jenkins配置SSH远程服务器连接

    之前用jenkins做了一个自动发布测试,配置任务的Post Steps时,选择的是执行shell命令.如下图: 这是在本192.168.26.233服务器上测试的,此服务器上运行jenkins,to ...

  8. Day5-1 面向对象和面向过程

    摘要: 类的定义 类的增删改查 对象的增删改查 对象的查找和绑定 面向对象和面向过程的区别: 1.面向过程就像是工厂的流水线,按部就班的有序的工作. 优点:把复杂的问题简单化 缺点:可扩展性差.一个步 ...

  9. Golang的时间生成,格式化,以及获取函数执行时间的方法

    最近都在通过完成一些列功能强化自己对常用api的熟悉. 然而关于时间的api几乎是最常用的api类型,所以总结一些常用的. 以YY-mm-dd HH:MM:SS.9位 输出当前时间: func mai ...

  10. HeapSter安装(k8s1.12以后废弃了)

    HeapSter InfluxDB(持久存储) Grafana 展示InfluxDB的数据(类似kibana) #安装InfluxDB #github https://github.com/kuber ...