1. 程式人生 > 其它 >(Java)單鏈表的反轉

(Java)單鏈表的反轉

技術標籤:演算法java單鏈表連結串列面試

Java_單鏈表的反轉

迭代(雙指標)

在這裡插入圖片描述
cur : 當前節點, 初始化為 head(頭節點) / 第一個節點
pre : 當前節點的前一個節點 , 初始化為null
temp : 當前節點的下一個節點

反轉開始:
一:

 //暫存下一個節點,並將當前結點指向前一個節點
ListNode temp = cur.next;
			cur.next = pre;	

在這裡插入圖片描述
二:

//訪問下一個節點
		pre = cur;
		cur = temp;

在這裡插入圖片描述
重複此過程,直到cur節點為null 停止

上述步驟就是將 1指向null , 2指向1 .... 直到當前結點為null,反轉完成
//完整程式碼
public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while(cur!=null){
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }

遞迴

遞迴需要滿足的條件
	1.一個問題的解可以分解為幾個子問題的解
	2.這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣
	3.存在遞迴終止條件
(例如:上課時你想知道自己是第幾排,
		你只需要問你的前一排是第幾排,
		然後你的前一排繼續往前問,直到問到第一排)
所以遞迴:找到終止條件,關注子問題的解決就行,不建議糾結遞迴的過程,容易繞暈,過程其實都是一樣的

單鏈表的反轉,其實就是兩個節點的反轉

 private ListNode reverse(ListNode cur, ListNode pre) {
		//終止條件
        if (cur == null){
        	 return pre;
         }
         // 遞迴後繼節點
        ListNode res = reverse(cur.next, cur); 
        //反轉,當前結點指向前繼節點
        cur.next = pre;         
        //返回反轉連結串列的頭節點     
        return
res; }

完整程式碼

public ListNode reverseList(ListNode head) {
        return reverse(head,null);
    }
    public ListNode reverse(ListNode cur,ListNode pre){
        if(cur==null){
            return pre;
        }
        ListNode node =  reverse(cur.next,cur);
        cur.next = pre;
        return node;
    }