要求很簡單,輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。
反轉鏈表是有2種方法(遞歸法,遍歷法)實現的,面試官最愛考察的算法無非是斐波那契數列和單鏈表反轉,遞歸方法實現鏈表反轉比較優雅,可是對於不瞭解遞歸的同窗來講仍是有理解難度的。node
整體來講,遞歸法是從最後一個Node開始,在彈棧的過程當中將指針順序置換的。面試
爲了方便理解,咱們以 1->2->3->4這個鏈表來作演示。輸出的效果是4->3->2->1算法
首先定義Node:bash
public static class Node {
public int value;
public Node next;
public Node(int data) {
this.value = data;
}
}複製代碼
反轉方法以下:ui
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;
}複製代碼
遞歸實質上就是系統幫你壓棧的過程,系統在壓棧的時候會保留現場。this
咱們來看是怎樣的一個遞歸過程:1->2->3->4spa
返回新鏈表的頭結點newHead指針
注意:當retuen後,系統會恢復2結點壓棧時的現場,此時的head=2結點;temp=2結點.next(3結點),再進行上述的操做。最後完成整個鏈表的翻轉。code
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做 者:上帝愛吃蘋果
出 處:www.cnblogs.com/keeya
關於博主:決定咱們心情的不止是如今這個時候咱們所擁有的,更是咱們對將來的預期。
版權聲明:署名 - 非商業性使用 - 禁止演繹,協議普通文本 | 協議法律文本。
聲援博主:若是您以爲文章對您有幫助,能夠點擊文章右下角【推薦】一下。您的鼓勵是博主的最大動力!