劍指Offer的學習筆記(C#篇)-- 反轉鏈表

題目描述

輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。

一 . 概念普及

        關於線性表等相關概念請點擊這裏html

二 . 實現方法

        目前,能夠有兩種方法實現該要求。node

        方法一:藉助外部空間實現。這裏能夠將單鏈表儲存爲數組,而後按照數組的索引逆序進行反轉。此處,可理解爲將鏈表裝換爲順序表,而後把隊伍方向反轉,可是,此方式比較浪費空間,並且須要兩次遍歷,效率不佔優點。數組

        代碼實現:spa

public static Node ReverseList1(Node head) { //指針是否爲空判斷(魯棒性)
        if(head == null) { return null; } //定義新的鏈表nodeList
        List<Node> nodeList = new List<Node>(); //當head不爲空時,執行
        while (head != null) { nodeList.Add(head); head = head.Next; } //         int startIndex = nodeList.Count - 1; for (int i = startIndex; i >= 0; i--) { Node node = nodeList[i]; if (i == 0) { node.Next = null; } else { node.Next = nodeList[i - 1]; } } // 如今頭結點是原來的尾節點
        head = nodeList[startIndex]; return head; }

        方法二:三指針法,不作過多闡述,代碼備註蠻詳細的。下圖即爲具體實現過程。指針

        代碼實現:code

class Solution { public ListNode ReverseList(ListNode pHead) { // write code here //魯棒斷定
        if(pHead == null) { return null; } //定義A B 兩個指針
        ListNode A = null; ListNode B = null; //循環操做
        while(pHead != null) { //定義B爲PHead後面的數,定義A爲pHead前面的數
            B = pHead.next; pHead.next = A;  //這一部分就理解成A是PHead前面的那個數吧。 //而後再把A和pHead都提早一位
            A = pHead; pHead = B; } //循環結束後,返回新的表頭,即原來表頭的最後一個數。
        return A; } }

        固然,用遞歸也能實現哦。該題魯棒判斷在於指針是否爲空。htm

相關文章
相關標籤/搜索