有个小需求要求实现一个双向链表的反转于是就有了下边代码:

链表元素结构定义:

package com.util;

public class LinkedNode<T>{
private T value;
private LinkedNode<T> prev;
private LinkedNode<T> next; public LinkedNode(T value, LinkedNode<T> prev, LinkedNode<T> next) {
super();
this.value = value;
this.prev = prev;
this.next = next;
} public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public LinkedNode<T> getPrev() {
return prev;
} public void setPrev(LinkedNode<T> prev) {
this.prev = prev;
} public LinkedNode<T> getNext() {
return next;
}
public void setNext(LinkedNode<T> next) {
this.next = next;
}
}

链表定义:

package com.util;

public class LinkedList<T>{
private transient int size=0;
private transient LinkedNode<T> first=null;
private transient LinkedNode<T> last=null; /**
* 添加元素到双向链表头部
* */
public void addFirst(T t){
LinkedNode<T> oldFirst = first;
LinkedNode<T> newNode = new LinkedNode<T>(t, null,oldFirst);
first = newNode; if (oldFirst == null)
last = newNode;
else
oldFirst.setPrev(newNode); size++;
} /**
* 将双向链表转化为一元数组:從頭開始循環到尾部。
* */
public Object[] toArray() {
Object[] result = new Object[size];
int i = 0;
for (LinkedNode<T> node = first; node != null; node = node.getNext())
result[i++] = node.getValue();
return result;
} /**
* 反轉
* */
public void reverse(){
if(first==null||last==null)
return; LinkedNode<T> prev;
LinkedNode<T> next;
LinkedNode<T> newFirst=null;
LinkedNode<T> newLast=null;
for (LinkedNode<T> node = first; node != null; node = node.getPrev()){
prev= node.getPrev();
next= node.getNext(); if(node.getPrev()==null){
newLast=node;
}else if(node.getNext()==null){
newFirst=node;
} node.setNext(prev);
node.setPrev(next);
} first=newFirst;
last=newLast;
}
}

备注:这里主要实现了三个功能,在链表头部添加元素、toArray函数、反转函数,实际上链表应该包含其他功能:末尾添加元素,插入元素,索引,移除,遍历等。

测试代码:

import com.util.LinkedList;

public class LinkedListTest {
public static void main(String[] args) {
LinkedList<String> list=new LinkedList<String>();
list.addFirst("5");
list.addFirst("3");
list.addFirst("1"); for (Object string : list.toArray()) {
System.out.println(string);
} System.out.println("-------------------------------開始反轉-------------------------------");
list.reverse();
System.out.println("-------------------------------結束反轉-------------------------------"); for (Object string : list.toArray()) {
System.out.println(string);
}
} }

Java:双向链表反转实现的更多相关文章

  1. Java 控制反转和依赖注入模式【翻译】【整理】

    Inversion of Control Containers and the Dependency Injection pattern --Martin Fowler 本文内容 Component ...

  2. java控制反转与依赖注入

    1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...

  3. java 字符串反转

    描述:给我一个字符串,例如I love java,输出: java love I   方法一 public class StringReverse { public void swap(char[] ...

  4. 【Java SE】如何用Java实现反转排序

    摘要:反转排序是将原先已经排序好了的重新排序,是原来的数组元素的顺序反转过来.假设原来的数组顺序是{6,5,4,3,2,1},反转之后的顺序就是{1,2,3,4,5,6}.这个排序的算法不是很难,代码 ...

  5. java 控制反转和依赖注入的理解

    开始好好学习java基础和思想~ 控制反转(IOC)是Spring框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲new了,你就说你要干啥,然后外包出去就好~ 依赖注入(DI) 在我浅薄的 ...

  6. 如何用Java实现反转排序

    摘要:反转排序是将原先已经排序好了的重新排序,是原来的数组元素的顺序反转过来.假设原来的数组顺序是{6,5,4,3,2,1},反转之后的顺序就是{1,2,3,4,5,6}.这个排序的算法不是很难,代码 ...

  7. Java程序设计——反转字符串 & 找朋友 & 计算int型二进制1的个数 & 情报加密 & 计算日期 & 求近似数 & 输出较小数(练习1)

    作为刚刚入门Java的选手,其实C++的功底起到了很大的作用.但是,Java之于C++最大的不同,我个人认为,是其类的多样性.才入门的我,写着老师布置的简单的面对过程的题,如果是C++,可以算是简单了 ...

  8. Java基础-反转数组

    /** java基础,如何将一个数组反转,思考方法采用使用临时变量的情况下,将第一个元素与第二个元素进行反转,需要定义两个索引,一个记录数组的第一个元素与最后一个元素,将其两两交换* */public ...

  9. JAVA双向链表

    1.链表是一种重要的数据结构,在程序设计中占有很重要的地位 2.我们可以用类List来实现链表结构,用变量Head.Tail.Length.Pointer来实现表头.存储当前结点的指针时有一定的技 巧 ...

随机推荐

  1. [原创]浅谈移动App安全测试

    [原创]浅谈移动App安全测试 移动互联网很火,就像当年互联网兴起一样,这几天和朋友在沟通交流,谈到一个话题,你们做金融App钱放在你们哪边安全不?会不会你们做的移动App不安全,让人盗了里面的资金, ...

  2. Unity3D脚本(MonoBehaviour)生命周期

    场景中有2个物体:A,B 每一个物体上绑定2个脚本:A,B 初始化log: Object : A , Script : B , Message : Awake Object : A , Script ...

  3. 如何调整word中表格某一列占半分比

    1.可以拖动,但是不准确 2.

  4. win10企业版永久激活2017怎么用

    Win10正式版永久激活用命令和密钥即可工具原料:电脑+win10win10企业版永久激活方法如下:1."WIN+R"打开运行对话框,输入命令slmgr.vbs -xpr,点击确定 ...

  5. SpringBoot 中使用 @Value 为 static 变量赋值

    原文:https://www.jianshu.com/p/ea477fc9abf7 例如: public class Utils { @Value("${test.host}") ...

  6. C++点和箭头操作符用

    http://www.cnblogs.com/ManMonth/archive/2013/09/05/3302873.html C++点和箭头操作符用法区别 变量是对象的时候用“.”访问 变量是对象指 ...

  7. jquery 实现table的行列选中效果改进

    行列都可以多选,也可对相应数据进行统计: 行选中效果 列选中效果

  8. Wireshark基本用法 && 过滤规则 && 协议详解

    基本使用: https://www.cnblogs.com/dragonir/p/6219541.html 协议解析: https://www.jianshu.com/p/a384b8e32b67 ( ...

  9. svn: E155015: 提交失败(细节如下) 解决办法

    svn 出现冲突是经常发生的事,最近改用命令操作svn,用界面电脑有些反应慢 出现冲突使用svn 命令肯定也是可以解决的: 查看警告信息提示冲突的文件,执行 svn resolved <文件名& ...

  10. Logcat多tag过滤

    当Android设备通过usb连接成功后,在logcat中能看到很多log信息,但太多了很容易将我们关注的日志给淹没掉,所以我们需要过滤.如果接入了不同的SDK,那么log的tag可能会不同,所以有时 ...