题目要求: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. 剑指offer--3.从头打印链表

    题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路:可以利用push 和unshift /*function ListNode(x){ this.val = x; this. ...

  2. 【转载】SQL中inner join、outer join和cross join的区别

    对于SQL中inner join.outer join和cross join的区别很多人不知道,我也是别人问起,才查找资料看了下,跟自己之前的认识差不多, 如果你使用join连表,缺陷的情况下是inn ...

  3. java 类与类,类与接口 ,接口与接口关系

    类: 生活中类是人们对客观事物不断认识而产生的抽象概念,而对象则是现实生活中的一个个实体 面向对象程序设计中,对象是程序的基本单位,相似的对象像变量和类型的关系一样归并到一类,所以,并不先具体地定义对 ...

  4. 史上最全 原生javascript的知识总结,适合新手及查资料用!

    适合右键另存为图片保存,再放大看!

  5. B-Tree 和 B+Tree

    B-Tree和B+Tree 本文来自 Hubery_James 的CSDN 博客 ,全文地址请点击:原文地址-干货满满 B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索 ...

  6. [python]解决Windows下安装第三方插件报错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 0:

    系统:win7IDE:pycharm Python版本:2.7 安装第三方插件是报错:  报错原因与编码有关,pip把下载的临时文件存放在了用户临时文件中,这个目录一般是C:\Users\用户名\Ap ...

  7. MySQL中有关NULL的计算

    mysql> select NULL=NULL; #判断两个NULL是否相等,结果不是1也不是0 +-----------+ | NULL=NULL | +-----------+ | NULL ...

  8. UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-25: ordinal not in range(128)

    python报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-25: ordinal not in ...

  9. scoketio

    服务器代码let net = require('net'); // 创建服务器 let server = net.createServer(); // 定义一个数组 ,存放每一个连接服务器的客户端用户 ...

  10. [转帖]Linux命令中特殊符号

    Linux命令中特殊符号 转自:http://blog.chinaunix.net/uid-16946891-id-5088144.html   在shell中常用的特殊符号罗列如下:# ; ;; . ...