告別吧 - 單鏈表反轉(Java 實現)
若有不足,還望指正,
一、遞歸實現
幫助理解:
編寫遞歸代碼時最重要的有以下三點 : —— 摘自《算法 4》
(1)遞歸總有一個最簡單的情況,即方法的第一條語句總是一個包含 return 的條件語句。
(2)遞歸調用總是去嘗試解決一個規模更小的子問題,這樣遞歸才能收斂到最簡單的情況。含有某個參數一直在縮小。
(3)遞歸調用的父問題和嘗試解決的子問題之間不應該有交集。
遞歸實現:
源代碼:
public class Test {
private static Node reverseByRecursion(Node head) {
if (head == null || head.getNext() == null) {
return head;
}
Node newHead = reverseByRecursion(head.getNext());
head.getNext().setNext(head);
head.setNext(null);
return newHead;
}
public static void main(String[] args) {
// 1、構建單鏈表
Node head = new Node(0);
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
head.setNext(node1);
node1.setNext(node2);
node2.setNext(node3);
node3.setNext(node4);
// 2、反轉
Node newHead = reverseByRecursion(head.getNext());
// 3、打印
while (newHead != null) {
System.out.print(newHead.getData() + " ");
newHead = newHead.getNext();
}
}
}
class Node {
private int data;
private Node next;
public Node(int data) {
this.data = data;
}
public int getData() {
return data;
}
public void setData(int Data) {
this.data = Data;
}
public Node getNext() {
return next;
}
public void setNext(Node Next) {
this.next = Next;
}
}
二、迭代實現
思路:
源代碼:
private static Node reverseByIterator(Node head) {
if (head == null || head.getNext() == null) {
return head;
}
Node pre = head;
Node cur = head.getNext();
Node tmp;
while (cur != null) {
tmp = cur.getNext();
cur.setNext(pre);
pre = cur;
cur = tmp;
}
head.setNext(null);
return pre;
}