有個小需求要求實現一個雙向鏈表的反轉於是就有了下邊代碼:
鏈表元素結構定義:
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); } } }