Java單鏈表的逆序

首先需要一個node,來實現單鏈表。

package com.lxk.linkedList.oneWay;

/**
 * @author lxk on 2017/8/1
 */
public class Node<K, V> {
    private final K key;
    private V value;
    private Node<K, V> next;

    public Node(K key, V value, Node<K, V> next) {
        this.key = key;
        this.value = value;
        this.next = next;
    }

    public K getKey() {
        return key;
    }

    public V getValue() {
        return value;
    }

    public void setValue(V value) {
        this.value = value;
    }

    public Node<K, V> getNext() {
        return next;
    }

    public void setNext(Node<K, V> next) {
        this.next = next;
    }
}

然後,就是怎麼實現逆序啦。

第一種實現,簡單好理解。

    /**
     * 逆序單鏈表
     *
     * @param head 單鏈表
     */
    public static Node<Integer, Integer> reverse1(Node<Integer, Integer> head) {
        Node<Integer, Integer> reverse = null;
        Node<Integer, Integer> current = head;
        while (current != null) {
            Node<Integer, Integer> temp = current;
            current = current.getNext();
            temp.setNext(reverse);
            reverse = temp;
        }
        return reverse;
    }

第二種實現。遞歸,不好理解。

    /**
     * 逆序單鏈表(遞歸)
     *
     * @param head 單鏈表
     */
    public static Node<Integer, Integer> reverse2(Node<Integer, Integer> head) {
        //當爲空或者本節點爲末尾節點的時候
        if (head == null || head.getNext() == null) {
            return head;
        }
        Node<Integer, Integer> reversedHead = reverse2(head.getNext());
        //獲取先前的下一個節點,讓該節點指向自身
        head.getNext().setNext(head);
        //破壞以前自己指向下一個節點
        head.setNext(null);
        //層層傳遞給最上面的
        return reversedHead;
    }

這裏再多放2個方法。

一個是初始化單鏈表。一個是輸出單鏈表。

    /**
     * 獲得單向鏈表(頭插法生成的單向鏈表--後來的在鏈表頭部)
     */
    public static Node<Integer, Integer> getOneWayLinkedList(int length) {
        Node<Integer, Integer> temp = null;
        for (int i = 1; i <= length; i++) {
            //頭插法:先來的在鏈尾
            temp = new Node<>(i, i, temp);
        }
        return temp;
    }
    /**
     * 輸出單向鏈表
     *
     * @param linkedList 單向鏈表,鏈表頭的位置開始。
     */
    public static void forLinkedList(Node<Integer, Integer> linkedList) {
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        while (linkedList != null) {
            sb.append("[k:").append(linkedList.getKey()).append(" v:").append(linkedList.getValue()).append("]");
            linkedList = linkedList.getNext();
        }
        sb.append("}");
        System.out.println(sb.toString());
    }
然後就是main方法,實際運行,看結果。
        Node<Integer, Integer> linkedList = getOneWayLinkedList(6);
        forLinkedList(linkedList);
        //Node<Integer, Integer> node = reverse1(linkedList);
        Node<Integer, Integer> node = reverse2(linkedList);
        forLinkedList(node);

然後就是運行結果啦。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章