1. 程式人生 > >【演算法】Java單鏈表逆轉

【演算法】Java單鏈表逆轉

單鏈表逆轉置的遞迴與非遞迴方式

Node類

public class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

先看遞迴求解:

public ListNode reverse1(ListNode head) {
        // 當為空或者本節點為末尾節點的時候
        if (head == null || head.next == null)
            return head;
        ListNode temp = head.next;
        ListNode reversedHead = reverse1(head.next);
        // 獲取先前的下一個節點,讓該節點指向自身
temp.next = head; // 破壞以前自己指向下一個節點 head.next = null; // 層層傳遞給最上面的 return reversedHead; }

有點難理解,看看debug的圖基本上就能懂了。
這裡寫圖片描述

就是在temp儲存了尾節點,然後再一層層往前。這個head.next=null是必須的,因為最後一個節點時不會自己賦值的,會形成一個環。

非遞迴演算法:

public ListNode reverse(ListNode head){  
        ListNode p = head,q = null
,front = null; while(p!=null){ q = p.next;//設定q是p結點的後繼結點,即用q來保持p的後繼結點 p.next = front;//逆轉,即使p.next指向p結點的前驅結點 front = p;//front向後移一步 p = q;//p向後移一步 } head = front;//head指向原連結串列的最後一個結點,完成逆轉 return head; }

這個理解起來就比較簡單啦。