劍指Offer:面試題16——反轉鏈表(java實現)

問題描述

定義一個函數,輸入一個鏈表的頭結點,反轉該鏈表並輸出反轉後的鏈表的頭結點。鏈表結點如下:

public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

思路1:

要想反轉鏈表,對於結點i,我們要把它的next指向它的前趨,因此我們需要保存前趨結點,同時,如果我們已經把i的next重新賦值,會無法找到i的後繼,因此,在重新賦值之前,我們要保存i的後繼。

代碼:

public ListNode ReverseList(ListNode head) {

        if(head == null){
            return null;
        }
        ListNode rHead = null;
        ListNode prior = null;//store prior
        ListNode q = head;//store current

        while(q != null){
            ListNode next = q.next;//store the next

            if(next == null){
                rHead = q;
            }

            q.next = prior;

            prior = q;
            q = next;
        }

        return rHead;
    }

思路2:

使用遞歸的思想(暫時沒有想到,因爲如果用遞歸的話,每次應該是:鏈表的第一個結點<—遞歸返回的鏈表的尾指針,但是這樣的話就無法獲得反轉後的頭指針了。)後面再思考吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章