本文參考自《劍指offer》一書,代碼採用Java語言。html
更多:《劍指Offer》Java實現合集 java
定義一個函數,輸入一個鏈表的頭結點,反轉該鏈表並輸出反轉後鏈表的頭結點。面試
方法一:使用三個指針(pre,p,next)進行實現。令p指向pre,next則是用於防止鏈表斷裂(很簡單,詳見代碼)。函數
方法二(遞歸):找到最後一個結點做爲返回值,遞歸函數中,找到最後的頭結點後,開始進行每一個結點next值的轉換。 測試
測試算例 this
1.功能測試(鏈表有多個或一個結點)spa
2.特殊測試(頭結點爲null)指針
新:code
//iteratively public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode cur = head; while(cur!=null){ ListNode next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre; } //recursively public ListNode reverseList1(ListNode head) { if(head == null || head.next==null) return head; ListNode newHead = reverseList(head.next); head.next.next = head; head.next = null; return newHead; }
舊:htm
package _24; /** * * @Description 面試題24:反轉鏈表 * * @author yongh * @date 2018年10月15日 下午3:24:51 */ //題目:定義一個函數,輸入一個鏈表的頭結點,反轉該鏈表並輸出反轉後鏈表的 //頭結點。 public class ReverseList { public class ListNode { int val; ListNode next=null; ListNode(int val){ this.val=val; } } /* * 三個指針實現 */ public ListNode reverseList(ListNode head) { if(head==null) return null; ListNode pNode=head; ListNode preNode=null; ListNode nextNode=pNode.next; while(nextNode!=null) { pNode.next=preNode; preNode=pNode; pNode=nextNode; nextNode=pNode.next; } pNode.next=preNode; return pNode; } /* * 遞歸實現 */ public ListNode reverseList2(ListNode head) { if(head==null || head.next==null) return head; ListNode rvsHead=reverseList(head.next); //找到了最後的頭結點後,開始轉換每一個結點的指向 head.next.next=head; head.next=null; return rvsHead; } }
1.與鏈表相關的題目老是涉及大量指針操做,之後遇到鏈表相關的題目時,多考慮指針的使用。
2.遞歸實現時,第50行:head.next=
null
; 別忘記了。