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);
        }
    }

}

原文地址:https://www.cnblogs.com/yy3b2007com/p/8902435.html

时间: 2024-11-05 22:05:05

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

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

开始好好学习java基础和思想~ 控制反转(IOC)是Spring框架的核心思想,用我自己的话说,就是你要做一件事,别自己可劲new了,你就说你要干啥,然后外包出去就好~ 依赖注入(DI) 在我浅薄的想法中,就是通过接口的引用和构造方法的表达,将一些事情整好了反过来传给需要用到的地方~ 这样做得好处:做到了单一职责,并且提高了复用性,解耦了之后,任你如何实现,使用接口的引用调用的方法,永远不需要改变 举一个栗子: 写个接口,说咱们购物去~ public interface IShopping {

编程练习(2)&mdash;&mdash;双向链表反转

本文中的双向链表,具有一个首指针h,但没有尾指针,不是循环链表.链表反转时,要做两件事情,一是将数据部分的pre指针和next指针交换值:二是将h指针指向反转后的头数据节点指针,并将新链表的尾数据节点指针的next(即原链表头数据指针的next)置空. 上代码: DLinkedNode.h #ifndef DLINKEDNODE_H_INCLUDED #define DLINKEDNODE_H_INCLUDED #endif // DLINKEDNODE_H_INCLUDED #include

java控制反转及依赖注入

先来看看控制反转的基本含义: 控制反转(IOC)模式(又称DI:Dependency Injection)就是Inversion of Control,控制反转.在Java开发中,IoC意 味着将你设计好的类交给系统去控制,而不是在你的类内部控制.这称为控制反转.换句话说,就是将创建管理对象的工作交给容器来做. 传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象:而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建:谁控制谁?当然是

java控制反转与依赖注入

1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public class Main { public static void main(String[] args) { /******** 一般写法,Main类与Chinese类和American类之间的强耦合 ***********/ // Chinese和American,当类和方法修改时,此处的类和方法也需要修改

java 字符串反转

描述:给我一个字符串,例如I love java,输出: java love I   方法一 1 public class StringReverse { 2 3 public void swap(char[] arr, int begin, int end) { 4 while(begin < end) { 5 char temp = arr[begin]; 6 arr[begin] = arr[end]; 7 arr[end] = temp; 8 begin++; 9 end--; 10 }

java字符串反转

比方我想将 "javascript"反转为 "tpircsavaj".我们一般处理都是用for循环然后用StringBuffer一个字符一个字符加入. 事实上StringBuffer提供了一个reverse方法就能够实现.測试代码例如以下: package com.evan; public class ReverseTest { public static void main(String[] args) { String s = "javascript&

Java 双向链表 Mylinkedlist Mylinkedlisttest

package list; public class Mylinkedlist { private Node first; //第一个节点 private Node last; //最后一个节点 private int size = 0; // 节点的数量 public void addFrist(Object object){ Node node = new Node(object); if (size == 0){ this.first = node; this.last = node; }

Java字符串反转常见的几种方式?

(1)通过StringBuilder的reverse()方法,速度最快: 1 public class StringReverse { 2 public static void main(String[] args) { 3 String str="hello"; 4 System.out.println(reverse(str)); 5 6 } 7 public static StringBuilder reverse(String str){ 8 return new String

Java实现字符串反转

对于使用Java字符串反转有以下几种实现: 利用StringBuilder类中的reverse函数: 使用递归,将String的首字符放到除首字符外的子串后,然后再递归调用子串: 使用字符数组做reverse: public class Reverse { public static String reverse1(String str) { if (str == null || str.length() <= 1) return str; return new StringBuilder(st