1. 程式人生 > >Java:雙向鏈表反轉實現

Java:雙向鏈表反轉實現

雙向鏈表反轉 鏈表反轉 ans 定義 IE test link 雙向鏈表 out

有個小需求要求實現一個雙向鏈表的反轉於是就有了下邊代碼:

鏈表元素結構定義:

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:雙向鏈表反轉實現