要求很簡單,輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。
反轉鏈表是有2種方法(遞歸法,遍歷法)實現的,面試官最愛考察的算法無非是斐波那契數列和單鏈表反轉,遞歸方法實現鏈表反轉比較優雅,可是對於不瞭解遞歸的同窗來講仍是有理解難度的。java
整體來講,遞歸法是從最後一個Node開始,在彈棧的過程當中將指針順序置換的。
node
爲了方便理解,咱們以 1->2->3->4這個鏈表來作演示。輸出的效果是4->3->2->1面試
首先定義Node:算法
public static class Node { public int value; public Node next; public Node(int data) { this.value = data; } }
反轉方法以下:this
public Node reverse(Node head) { if (head == null || head.next == null) return head; Node temp = head.next; Node newHead = reverse(head.next); temp.next = head; head.next = null; return newHead; }
遞歸實質上就是系統幫你壓棧的過程,系統在壓棧的時候會保留現場。指針
咱們來看是怎樣的一個遞歸過程:1->2->3->4code
返回新鏈表的頭結點newHeadblog
注意:當retuen後,系統會恢復2結點壓棧時的現場,此時的head=2結點;temp=2結點.next(3結點),再進行上述的操做。最後完成整個鏈表的翻轉。遞歸
遍歷法就是在鏈表遍歷的過程當中將指針順序置換
先上代碼:ip
public static Node reverseList(Node node) { Node pre = null; Node next = null; while (node != null) { next = node.next; node.next = pre; pre = node; node = next; } return pre; }依舊是1->2->3->4