首先需要一個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);
然後就是運行結果啦。