Java:双向链表反转实现
有个小需求要求实现一个双向链表的反转于是就有了下边代码:
链表元素结构定义:
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:双向链表反转实现的更多相关文章
- Java 控制反转和依赖注入模式【翻译】【整理】
		
Inversion of Control Containers and the Dependency Injection pattern --Martin Fowler 本文内容 Component ...
 - java控制反转与依赖注入
		
1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...
 - java 字符串反转
		
描述:给我一个字符串,例如I love java,输出: java love I 方法一 public class StringReverse { public void swap(char[] ...
 - 【Java SE】如何用Java实现反转排序
		
摘要:反转排序是将原先已经排序好了的重新排序,是原来的数组元素的顺序反转过来.假设原来的数组顺序是{6,5,4,3,2,1},反转之后的顺序就是{1,2,3,4,5,6}.这个排序的算法不是很难,代码 ...
 - java 控制反转和依赖注入的理解
		
开始好好学习java基础和思想~ 控制反转(IOC)是Spring框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲new了,你就说你要干啥,然后外包出去就好~ 依赖注入(DI) 在我浅薄的 ...
 - 如何用Java实现反转排序
		
摘要:反转排序是将原先已经排序好了的重新排序,是原来的数组元素的顺序反转过来.假设原来的数组顺序是{6,5,4,3,2,1},反转之后的顺序就是{1,2,3,4,5,6}.这个排序的算法不是很难,代码 ...
 - Java程序设计——反转字符串 & 找朋友 & 计算int型二进制1的个数 & 情报加密 & 计算日期 & 求近似数 & 输出较小数(练习1)
		
作为刚刚入门Java的选手,其实C++的功底起到了很大的作用.但是,Java之于C++最大的不同,我个人认为,是其类的多样性.才入门的我,写着老师布置的简单的面对过程的题,如果是C++,可以算是简单了 ...
 - Java基础-反转数组
		
/** java基础,如何将一个数组反转,思考方法采用使用临时变量的情况下,将第一个元素与第二个元素进行反转,需要定义两个索引,一个记录数组的第一个元素与最后一个元素,将其两两交换* */public ...
 - JAVA双向链表
		
1.链表是一种重要的数据结构,在程序设计中占有很重要的地位 2.我们可以用类List来实现链表结构,用变量Head.Tail.Length.Pointer来实现表头.存储当前结点的指针时有一定的技 巧 ...
 
随机推荐
- java之ibatis数据缓存
			
使用IBatis作数据缓存 1.SqlMapConfig.xml中<settingscacheModelsEnabled="true" //设置为trueenhancemen ...
 - (67)Wangdao.com第十一天_JavaScript 数组的遍历
			
for 普通方式遍历 var arr = [0,1,2,3,4,5,6]; for(i=0; i<arr.length; i++){ document.write("["+i ...
 - VGA Signal Timing
			
VGA Signal Timing 640 x 350 VGA 640x350@70 Hz (pixel clock 25.175 MHz) VESA 640x350@85 Hz (pixel clo ...
 - ARM LDR/STR, LDM/STM 指令
			
这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令, 关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作 ...
 - python及扩展程序安装
			
安装 从官方网站下载python程序,我下载的是python-3.3.2.msi 然后下载python扩展程序,我下载的是pywin32-218.win32-py3.3.exe 最后下载wmi插件,我 ...
 - LOG EXPLORER   ApexSQL Log
			
http://www.minisoft.cn/ https://www.apexsql.com/sql_tools_log.aspx
 - setsockopt 设置TCP的选项SO_LINGER
			
SO_LINGER选项用来设置延迟关闭的时间,等待套接字发送缓冲区中的数据发送完成. 没有设置该选项时,在调用close()后,在发送完FIN后会立即进行一些清理工作并返回.如果设置了SO_LINGE ...
 - TrinityCore 魔兽世界私服11159 完整配置
			
为什么要研究TrinityCore ? (1)它是一个完整成熟的可运行调试的网游服务器框架. (2)它是一个跨平台的标准C++编写的项目,在Windows.Linux.MacOSX上都可编译运行. ( ...
 - C#编程(五十六)----------可观察的集合ObservableCollection
			
原文链接: http://blog.csdn.net/shanyongxu/article/details/47080685 可观察的集合 如果需要集合中的元素核实删除或添加的信息,就可以使用Obse ...
 - i386、i586、i686、noarch、x86_64
			
xxxxxxxxx.rpm <== RPM的格式,已经经过编译且包装完成的rpm文件. xxxxxx.src.rpm <== SRPM的格式,包含未编译的源代码信息. 例如rp-p ...