自定义节点类Node.java,用于创建链表
package com.zr.demo;
public class Node<T> {
private final T value;
private Node<T> next;
public Node(T value) {
this.value=value;
this.next=null;
}
public Node<T> getNext() {
return next;
}
public void setNext(Node<T> next) {
this.next = next;
}
public T getValue() {
return value;
}
public static <T> void printLinkedList(Node<T> head) {
while (head!=null) {
System.out.print(head.getValue()+" ");
head=head.getNext();
}
System.out.println();
}
}
自定义链表类LinkedList.java
package com.zr.demo;
import java.util.Arrays;
import java.util.List;
public class LinkedList {
public <T> Node<T> createLinkedListByRecursion(List<T> data) {
if (data.isEmpty()) {
return null;
}
Node<T> firstNode=new Node<T>(data.get(0));
firstNode.setNext(createLinkedListByRecursion(data.subList(1, data.size())));
return firstNode;
}
public <T> Node<T> reverseLinkedListByRecursion(Node<T> head) {
if (head==null||head.getNext()==null) {
return head;
}
Node<T> newHead=reverseLinkedListByRecursion(head.getNext());
head.getNext().setNext(head);
head.setNext(null);
return newHead;
}
public Node<Integer> createLinkedListByLoop(int size) {
Node<Integer> prev=null;
Node<Integer> head=null;
for (int i = 1; i <= size; i++) {
Node<Integer> node=new Node<Integer>(i);
if (prev==null) {
head=node;
}else {
prev.setNext(node);
}
prev=node;
}
return head;
}
public <T> Node<T> reverseLinkedListByLoop(Node<T> head) {
Node<T> newHead=null;
Node<T> curNode=head;
while(curNode!=null) {
Node<T> next=curNode.getNext();
curNode.setNext(newHead);
newHead=curNode;
curNode=next;
}
return newHead;
}
public static void main(String[] args) {
LinkedList reverse=new LinkedList();
System.out.println("Test normal linkedlist by loop:");
Node.printLinkedList(reverse.reverseLinkedListByLoop(reverse.createLinkedListByLoop(5)));
System.out.println("Test large linkedlist by loop:");
reverse.reverseLinkedListByLoop(reverse.createLinkedListByLoop(1000000));
System.out.println("Test normal linkedlist by recursion:");
Node.printLinkedList(reverse.reverseLinkedListByRecursion(reverse.createLinkedListByRecursion(Arrays.asList(1,2,3,4,5))));
System.out.println("Test large linkedlist by recursion:");
Node.printLinkedList(reverse.reverseLinkedListByRecursion(reverse.createLinkedListByLoop(1000000)));
}
}
通过递归和循环两种方法比较。
可知:递归在处理大量数据时会造成栈溢出,而使用循环则不仅可以快速处理,而且不会造成资源占用导致的内存消耗