1. 程式人生 > >Java 反轉連結串列的兩種方法

Java 反轉連結串列的兩種方法

目錄

連結串列節點的資料結構

  • 連結串列的資料結構主要是由兩部分組成的,顯而易見,一個就是當前的節點儲存的資料,一個就是指向下一個節點。
/**
 * 連結串列的節點
 * 
 * @author yingmu
 *
 */
public class Node {
    private char Data;// 資料域  
    private Node Next;// 指標域  
    public Node(char Data) {  
        // super();  
        this.Data = Data;  
    }  
    public char
getData() { return Data; } public void setData(char Data) { this.Data = Data; } public Node getNext() { return Next; } public void setNext(Node Next) { this.Next = Next; } }

方法一:遍歷

/**
* 遍歷方法
* 
* @param current
* @return
* */
public static Node reverseList2(Node head) { if (head == null) return head; Node pre = head;// 上一結點 Node cur = head.getNext();// 當前結點 Node tmp;// 臨時結點,用於儲存當前結點的指標域(即下一結點) while (cur != null) {// 當前結點為null,說明位於尾結點 tmp = cur.getNext(); cur.setNext(pre);// 反轉指標域的指向
// 指標往下移動 pre = cur; cur = tmp; } // 最後將原連結串列的頭節點的指標域置為null,還回新連結串列的頭結點,即原連結串列的尾結點 head.setNext(null); return pre; }

方法二:遞迴

/**
* 遞迴,在反轉當前節點之前先反轉後續節點 
* 
* @param head
* @return
* 
*/
public static Node reverseList1(Node head) {
       // head看作是前一結點,head.getNext()是當前結點,reHead是反轉後新連結串列的頭結點  
       if (head == null || head.getNext() == null) {  
            return head;// 若為空鏈或者當前結點在尾結點,則直接還回  
        }  
        Node reHead = reverseList1(head.getNext());// 先反轉後續節點head.getNext()  
        head.getNext().setNext(head);// 將當前結點的指標域指向前一結點  
        head.setNext(null);// 前一結點的指標域令為null;  
        return reHead;// 反轉後新連結串列的頭結點  
}