Java 單連結串列逆序

qingyezhu發表於2014-03-31

 

程式碼:

package com.wangzhu.linkedlist;

public class LinkedListDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        Node head = null;
        Node reverseHead = null;

        // 連結串列長度為0
        head = new Node();
        for (int i = 0; i < 0; i++) {
            linkedList.add(head, new Node(i));
        }

        System.out.print("未操作:");
        linkedList.print(head);

        reverseHead = linkedList.reverse(head);

        System.out.print("反轉後:");
        linkedList.print(reverseHead);
        System.out.println();

        // 連結串列長度為1
        head = new Node();
        for (int i = 0; i < 1; i++) {
            linkedList.add(head, new Node(i));
        }

        System.out.print("未操作:");
        linkedList.print(head);

        reverseHead = linkedList.reverse(head);

        System.out.print("反轉後:");
        linkedList.print(reverseHead);    
        System.out.println();

        // 連結串列長度為2
        head = new Node();
        for (int i = 0; i < 2; i++) {
            linkedList.add(head, new Node(i));
        }

        System.out.print("未操作:");
        linkedList.print(head);

        reverseHead = linkedList.reverse(head);

        System.out.print("反轉後:");
        linkedList.print(reverseHead);
        System.out.println();

        // 連結串列長度為3
        head = new Node();
        for (int i = 0; i < 3; i++) {
            linkedList.add(head, new Node(i));
        }

        System.out.print("未操作:");
        linkedList.print(head);

        reverseHead = linkedList.reverse(head);

        System.out.print("反轉後:");
        linkedList.print(reverseHead);
        System.out.println();

        // 連結串列長度為4
        head = new Node();
        for (int i = 0; i < 4; i++) {
            linkedList.add(head, new Node(i));
        }

        System.out.print("未操作:");
        linkedList.print(head);

        reverseHead = linkedList.reverse(head);

        System.out.print("反轉後:");
        linkedList.print(reverseHead);
        System.out.println();
        
        // 連結串列長度為5
        head = new Node();
        for (int i = 0; i < 5; i++) {
            linkedList.add(head, new Node(i));
        }

        System.out.print("未操作:");
        linkedList.print(head);

        reverseHead = linkedList.reverse(head);

        System.out.print("反轉後:");
        linkedList.print(reverseHead);
        System.out.println();
        
        
//        未操作:反轉後:
//        未操作:0 
//        反轉後:0 
//
//        未操作:0 1 
//        反轉後:1 0 
//
//        未操作:0 1 2 
//        反轉後:2 1 0 
//
//        未操作:0 1 2 3 
//        反轉後:3 2 1 0 
//
//        未操作:0 1 2 3 4 
//        反轉後:4 3 2 1 0 


    }

}

class Node {
    int value;
    Node next;

    public Node() {
        this.value = -1;
        this.next = null;
    }

    public Node(int value) {
        this.value = value;
        this.next = null;
    }

    public Node(int value, Node next) {
        this.value = value;
        this.next = next;
    }
}

class LinkedList {
    /**
     * 後插法
     * 
     * @param head
     * @param node
     */
    public void add(Node head, Node node) {

        Node tempNode = head;
        if (tempNode == null) {
            return;
        }
        while (tempNode.next != null) {
            tempNode = tempNode.next;
        }
        tempNode.next = node;
    }

    public void print(Node head) {
        Node node = head;
        if (node == null || node.next == null) {
            return;
        }

        node = node.next;
        while (node != null) {
            System.out.print(node.value + " ");
            node = node.next;
        }
        System.out.println();
    }

    /**
     * 連結串列反轉
     * 
     * @param head
     * @return
     */
    public Node reverse(Node head) {
        // 當連結串列為空,或連結串列沒有元素
        if (head == null || head.next == null) {
            return head;
        }

        // 反轉頭節點
        Node reverseHead = new Node();

        Node firstNode = head.next;// 連結串列中節點的前一個節點
        Node node = firstNode.next; // 連結串列中的節點
        Node nextNode = null;
        if (node != null) {
            nextNode = node.next;// 連結串列中的節點的後一個節點
        }
        firstNode.next = null;
        while (nextNode != null) {
            node.next = firstNode;// 將當前節點的後一個一個改為其前一個節點(相對反轉之前)
            firstNode = node; // 將當前節點置為下一節點的前節點
            node = nextNode;// 獲取下一個節點
            nextNode = nextNode.next;// 獲取下一個節點的後一個節點
        }
        if (node != null) {
            // 當節點個數大於1時
            node.next = firstNode;
            reverseHead.next = node;
        } else {
            // 當只有一個節點時
            reverseHead.next = firstNode;
        }

        return reverseHead;
    }
}

 

相關文章