劍指offer面試16 反轉連結串列

頭像是我偶像發表於2017-07-03

一、題目

定義一個函式,輸入一個連結串列,反轉連結串列後,輸出反轉後連結串列的頭結點。

二、思考與分析

為了正確地反轉一個連結串列,需要調整連結串列中指標的方向,需要藉助3個指向相鄰結點的指標,因為在調整連結串列指標方向時,會使連結串列斷裂,如果不使多一個指標來記錄斷裂後的連結串列,就沒有辦法實現反轉整個連結串列的功能。

這裡寫圖片描述

  1. 輸入的一個完整連結串列
  2. 初始化三個指標,pre指標指向null,current指標指向頭結點,pos指標指向null。
  3. 開始迴圈,pos指向current指標的下一個結點,在反轉連結串列的指標方向時,儲存連結串列斷開的結點,將current的指標方向反轉,指向pre指標。
  4. 直到pos指標指向null時,迴圈結束,此時pre指標所指向的結點,正是反轉之後連結串列的頭結點。

三、程式碼實現

提高程式碼的魯棒性,反問自己:
* 輸入的連結串列頭指標為NULL或整個連結串列只有一個結點,程式是否有處理?
* 反轉後的連結串列出現斷裂的情況,程式是否有處理?
* 返回的反轉連結串列的頭結點是否為原始連結串列的頭結點?

public ListNode ReverseList(ListNode head) {
    if(head == null){
            return null;
        }
        ListNode pre = null;
        ListNode current = head;
        ListNode pos = null;
        while (current != null) {
            pos = current.next;
            current.next = pre;
            pre = current;
            current = pos;
            if(pos == null){
                break;
            }
        }
        return pre;
    }

溫馨提示:

自己多花時間找出問題並修正問題,比在面試官找出問題之後再去慌慌張張修改程式碼要好得多。

相關文章