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

链表元素结构定义:

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. 【图像处理】基于OpenCV底层实现的直方图匹配

    image processing 系列: [图像处理]图片旋转 [图像处理]高斯滤波.中值滤波.均值滤波 直方图匹配算法.又称直方图规定化.简单说.就是依据某函数.或者另外一张图片的引导,使得原图改变 ...

  2. LPC43XX TQFP144 IO Pinout

  3. loading加载和layer.js

    layer.js中的loading加载 l本篇主要介绍layerjs中的loading加载在实际项目中的应用 1.使用的技术 前端:HTML5+CSS3+JS+layer.js 后端:.net 2.遇 ...

  4. 改变窗体大小视图区图形也会跟着变化 MFC

    怎样实现窗体缩放,视图区里的图形也会跟着变化 在CMFCView类中加入三个消息函数: 在类向导中选中CMFCView类,点击右键---->类向导------>消息--------> ...

  5. 体验h5离线缓存

    摘要 Application Cache是浏览器自己的一种机制,随着移动互联网时代的到来,如果我们已经将需要的文件缓存下下来,一旦网络无法访问,也能继续访问.不仅能提高用户体验,而且在有网络时,也能直 ...

  6. springcloud 分布式服务跟踪sleuth+zipkin

    原文:https://www.jianshu.com/p/6ef0b76b9c26 分布式服务跟踪需求 随着分布式服务越来越多,调用关系越来越复杂,组合接口越来越多,要进行分布式服务跟踪监控的需求也越 ...

  7. lastlog

    [root@li739-39 ~]# lastlogUsername Port From Latestroot pts/1 183.15.253.245 Thu Oct 29 05:57:29 +00 ...

  8. OLE、OCX和ActiveX控件之间的比较

      OLE(Object Linking and Embedding,对象连接与嵌入) 一.过去的OLE和今天的OLE 最初的OLE含义是指在程序之间链接和嵌入对象数据,它提供了建立混合文档的手段(资 ...

  9. 架构:Eventually Consistent - Revisited

    原文地址:http://i.cnblogs.com/EditPosts.aspx?opt=1. I wrote a first version of this posting on consisten ...

  10. 关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数原理和使用

    关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数 关于session和cookie参考: http:// ...