關於線性表等相關概念請點擊這裏。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